Hallo maestrox,
warum willst Du unbedingt HEX-Daten auswerten ?
Das EASYMETER sendet ASCII Klartext.
Wie wäre es mit folgendem Sketch. Bei mir funktioniert der gut.
Je nach Nutzung einer SoftSerial-Schnittstelle über Digital-Ports, oder (nur bei MEGA oder DUO) einer der Hardwareschnittstellen Serial1 - serial3) sind die beiden Alternativanteile des Sketches durch setzen/entfernen der Kommentarzeichen auszuwählen.
(Weitere Erklärungen sind in den Kommentaren enthalten)
Durch Kontrolle der Länge und zB. erstes und letztes Zeichen eines Datensatzes kann man Übertragungsfehler mit hinreichender Sicherheit erkennen und ausblenden.
Die einzelnen Meßwerte kann man immer an der selben Position in einem Datensatz finden und als Teilstring weiter verarbeiten.
Umwandlung in Gleitkommazahlen für Nutzung in Tabellenkalkulations- oder Datenbankprogramme ist dann auch einfach möglich.
#include <SoftwareSerial.h> // Bibliothek für serielle Kommunikation über beliebige Digitalports
// "softSerial()"-Bibliothek stellt in etwa gleiche Funktionen und Syntax wie "Serial()"-Bibliothek zur Verfügung.
SoftwareSerial softSerial(11, 10); // Pin D11 ist Rx, Pin D10 ist Tx.
// Variablen definieren und initialisieren
char Rx1Chr = ""; // Variable zur Zwischenspeicherung eines empfangenen Bytes
String Rx1String =""; // in diesem String werden die Einzelzeichen zu einem Text kumuliert
void setup()
{
// initialisieren der seriellen Schnittstelle des Arduino.
Serial.begin(57600);
Serial.println("Serial interface ready for action");
/*/ Alternative 1:
//Initialisieren der Schnittstelle "Serial1" (nur bei MEGA und DUO möglich)
Serial1.begin(9600,SERIAL_7E1); // 6900 bit/s, 7 Nutzdatenbits, even-Parity, 1 Stopbit
// Serial1.println("Serial interface1 ready for action"); // nur, wenn auch Daten an "Serial1" gesendet werden können
*/
// Alternative 2:
// Initialisieren der seriellen Schnittstelle aus der SoftwareSerial Bibliothek.
softSerial.begin(9600); // 6900 bit/s, es werden immer 8 bit pro Zeichen eingelesen (ggf. ist das oberste bit (MSB)das Parity-bit)
// softSerial.println("softSerial interface ready"); // nur, wenn auch Daten an "softSerial" gesendet werden können
}
void loop()
{
/*/Alternative 1:
//Nutzung der Serial1-Schnittstelle (nur MEGA oder DUO)
while(Serial1.available() > 0){ // solange Daten im Rx-Pufferspeicher sind (maximal 64 Byte) oder neue empfangen werden
Rx1Chr = Serial1.read(); // Speichere das empfangene Zeichen in der Variablen
Rx1String.concat(Rx1Chr); // empfangenes Zeichen an den Rx-String anfügen
}
*/
// Alternative 2:
// Nutzung der SoftwareSerial-Schnittstelle
while(softSerial.available()) { // solange Daten im Rx-Pufferspeicher sind (maximal 64 Byte) oder neue empfangen werden
Rx1Chr = softSerial.read(); // Speichere das älteste empfangene Zeichen in der Variablen
Rx1Chr &= B01111111; // das MSB enthält das Paritätsbit und wird durch diese bit-weise UND-Verknüpfung auf 0 gezwungen
Rx1String.concat(Rx1Chr); // empfangenes Zeichen an den Rx-String anfügen
}
// Weiterverarbeitung der empfangenen Daten ( Beispiel zum Mitlesen auf dem seriellen Monitor in der Arduino-IDE)
Serial.print(Rx1String); // sende den empfangenen Text auf die USB-Schnittstelle
Rx1String=""; // Stringvariable für nächsten Datenblock frei machen
}
Gruß
Tommy56:
Warum wartest Du dann nicht, bis Du 4x0x1b und danach 4 x 0x01 empfängst. Dann hast Du einen definierten Anfang und kannst das Telegramm aufzeichnen.
Wenn Dann wieder ein 0x1b kommt merkst Du Dir die Position. Wenn es dann wieder 4x0x1b und danach 4 x 0x01 sind, war das die Endeposition und Du schreibst dort ein 0-Byte als Abschluß hin. Wenn nicht, wartest Du wieder auf 0x1b.
Damit kannst Du sicher sein, dass Du eine komplette Message hat und dann kannst Du diese auswerten.
Dann ist entweder Deine Übertragung falsch oder Deine Info mit dem 0xFF.
Außerdem sollten beide Seiten einer Kommunikation mit dem gleichen Protokoll arbeiten.
Gruß Tommy