seriell Daten auswerten und Anzeigen

Hallo Forum,

habe ein Projekt zur Ansteuerung einer LED P10 Anzeige mit 3 Elementen.
Die EDV sendet zyklisch im Takt von 1 Sekunde seriell einen Datensatz. Dieser ist wie folgt aufgebaut:
STX-123,45#3,4ETX… Also Startzeichen STX dann negatives Vorzeichen wenn der Messwert negativ ist, sonst Leerzeichen und den Messwert 123,45 im ersten Teil und den Messwert 3,4 im zweiten Teil.
Dem Messwert im ersten Teil wird die Masseinheit “t” hinzugefügt und der Anzeige LED P10 im linken Teil zur Anzeige gebracht. Der Messwert im zweiten Teil bekommt die Maßeinheit “t/min” zugeordnet und wird im rechten Teil der LED P10 angezeigt. Leerzeichen werden ausgeblendet bzw. nicht zur Anzeige übertragen.
Wenn ein Messwertfehler auftritt sendet die EDV den Datensatz: STX 2…#…ETX. Dabei soll die Anzeige
“ERR” anzeigen.

Ich habe das Programm am laufen und auch entsprechend getestet. Das läuft bei mir in der Werkstatt ziemlich stabil. Da kam der Fehlerfall (ERR in der Anzeige) so ein Mal in der halben Stunde obwohl die Daten seriell immer gleich gesendet werden. Deshalb auch die Zählung der Fehlermeldungen.
Im Dauertest im der fertigen Anlage lief die Anzeige einen Tag ohne größere Ausfälle. Danach jedoch fast nur noch die Fehlermeldung ERR. Das bedeutet das an einer bestimmten Stelle ein Leerzeichen erkannt wird.
Ich finde den Fehler zumindest nicht gleich. Vielleicht kann mal jemand über den Code sehen und einen Fehler entdecken. Ich denke das sich irgendwo noch Zeichen im Puffer befinden die den Fehler verursachen.

Hier der Code im Anhang da nur Max. 9000 Zeichen gepostet werden können:

Anzeige_V1.6.x.ino (11 KB)

Du hast da eine Menge Zeilen drin, die nicht als Kommentar gekennzeichnet sind, aber solche sind wie z.B. char "rc"

Das nimmt Dir der Compiler ab?

Gruß Tommy

Ja der Sketch ist geladen und läuft auf einen Nano. Die Anzeige funktioniert ja in der Werkstatt. Da kam 1 - 2 mal die ERR Meldung. Deshalb der Zähler auf 5. Wird bei jeden korrekten Datentelegramm auf Null gesetzt. ich kann nur die Leerzeichen für die Fehlermeldung auswerten da im "normalen" Telegramm auch Ziffern an erster Stelle auftreten können. Würde auch ungern auf die Fehlerauswertung verzichten da die Anzeige nicht aktualisiert wird und der "alte" Messwert in der Anzeige steht ohne das dieser gesendet wird. Alternativ würde auch eine komplette Dunkelschaltung im Fehelrfall gehen. Ändert aber an der Fehlerauswertung bzw. Bestimmung nichts.

In char rc werden die Daten eingelesen. Das sind abgeänderte Programmzeilen aus dem Netz von Beispielen. Diese fand ich sehr hilfreich da die Steuerzeichen STX und ETX ausgewertet werden.
Anschließend noch die Terminierung mit Null. Das Aufteilen funktioniert auch. Kann jetzt keinen Fehler finden. Leider ist die Fehlermeldung eben auch ein bis zwei mal in der Werkstatt aufgetreten. Im seriellen Monitor, der parallel zur Anzeige läuft, waren die einzelnen Werte auch in Ordnung.

Ich habe nochmals ein paar Sachen getestet. Dabei ist mir aufgefallen das die Variable RET auf 1 gesetzt wird bzw. initialisiert wird und den Wert nicht enthält. Ich habe die serielle Ausgabe erweitert und gebe RET aus. Dabei wird 3 x der Wert -19 und beim 5 x der Wert 0 ausgegeben. Wenn da natürlich mal 5 oder mehr drin steht kommt die ERR Meldung. Wie kann es sein das dort der Wert -19 steht? Könnte die in unsigned int ändern. Wäre aber trotzdem die Frage warum der Wert -19 dort steht…???

30.04.2020 22:03:44.67 [TX] - -144,44#4,4 gesendet von EDV
30.04.2020 22:03:44.73 [RX] - -144,44t Gewichtswert
52 tempChar(3) //DEC Format
52 ptr Variable ist tempChar(3) //DEC Format
-19 Variable “RET”
32 Variable “Check” //zum Vergleich ERR
0-144,44 Variable i und kompletter String tempChar

30.04.2020 22:03:45.70 [TX] - -144,44#4,4
30.04.2020 22:03:45.77 [RX] - -144,44t
52
52
-19
32
0-144,44

30.04.2020 22:03:46.71 [TX] - -144,44#4,4
30.04.2020 22:03:46.77 [RX] - -144,44t
52
52
-19
32
0-144,44

30.04.2020 22:03:47.71 [TX] - -144,44#4,4
30.04.2020 22:03:47.77 [RX] - -144,44t
52 Variable tempChar
52 Variable ptr
0 Hier wird die Variable RET 0 !!!
32 Variable check
1-144,44 Zähler i zählt hoch (Bei>5 ERR)

Anzeige_V1.6.x.ino (10.7 KB)

Ich habe mich nochmals zu dem Thema hingesetzt. Die negativen Werte sind ok. Das bedeutet das die erste Variable kleiner als die zweite ist. Da ist das Ergebnis negativ.
Was aber bleibt ist der fehlerhafte Vergleich mit " strcmp ". Ich habe dazu parallel eine if Bedingung geschrieben.
Diese prüft an einer Stelle im Programm die gleiche Bedingung. Die eine Variable ist ein festes Zeichen und die andere das 3. Zeichen. Diese gebe ich zur Kontrolle seriell aus. Und da stelle ich fest das alle Variablen für den Vergleich die selben sind. Jedoch der Vergleich mit der if Bedingung nach dem 5 x stimmt und die Vergleichsfunktion mit strcmp auf einmal 0 ergibt obwohl die Variablen ungleich sind. Man kann das an der seriellen Ausgabe erkennen. Hat jemand schon mal solch ein Problem gehabt?

Grüße Camillo

01.05.2020 21:09:45.66 [TX] - 29,36#3,6 // gesendeter Datensatz
01.05.2020 21:09:45.69 [RX] - Zeichen 57 // Zeichen an 3. Stelle für den 1. Vergleich
y= 32 // festes Zeichen für den Vergleich (Leerz.)
Fehlermeldung 0 // result. Ergebnis der if Bedingung (OK)
29,36 // bereingter Datensatz Gewicht
57 // ermitt. Zeichen an 3. Stelle
57 // ermitt. Zeichen für den Vergleich
0 // Ergebnis des Vergleich (0 = gleich)
32 // festes Zeichen für den Vergleich (Leerz)
2 29,36 // ERR Zähler mit Gewicht

strcmp liefert 0 bei Gleichheit, >0 bei zeichenkette1 > zeichenkette2, ansonsten < 0. Das sind beim Unterschied die Differenzen der Zeichencodes.

Gruß Tommy

Ja das ist schon klar. Verstehe nur nicht warum bei der Überprüfung die Variable mit Wert 57 und die Variable mit Wert 32 bei strcmp den Wert 0 ergibt und bei der if Bedingung den Wert Fehlermeldung = 0 der korrekt ist, da keine Übereinstimmung besteht. Ich mache den Vergleich ja jetzt zur Kontrolle 2 x . Das erste mal gleich nach dem Schreiben der Zeichen in den String mit der if Bedingung und dann nochmals mit der strcmp Funktion.

Ich vermute, das passiert meistens dann wenn mehrere Zeichen im Puffer sind.

Ich habe nochmals den Sketch geändert. Die Fehlerdiagnose erfolgt jetzt an einer anderen Stelle. Dabei ist mir aufgefallen dass die Variable, derern Wert ich mit 0 global definiere diesen nur nach der ersten seriellen Ausgabe besitzt. Anschließend hat die Variable lt. serieller Ausgabe einen anderen Wert obwohl der Wert nur von 0 an weitergezählt werden soll. Wieso ändert sich der Wert? Ist die Variable dann doch nicht global?

02.05.2020 20:07:34.77 [TX] - -144,44#4,4
02.05.2020 20:07:34.82 [RX] - Zeichen 44 y= 32
Fehler 0 Anzahl: 0 Fehler 0, Anzahl: 0
-144,44
32
0-144,44

02.05.2020 20:07:35.78 [TX] - -144,44#4,4
02.05.2020 20:07:35.83 [RX] - Zeichen 44 y= 32
Fehler 0 Anzahl: -4291 Fehler immer noch 0, Anzahl aber -4291 ???
-144,44
32
0-144,44

Anzeige_V1.6xx.ino (10.9 KB)