Hallo,
ich möchte (zum ersten mal) serielle Daten von einem Gerät in einen Arduino Mega einlesen und verarbeiten.
die Daten werden vom Quell-Gerät Zeilenweise ausgegeben und enden immer mit LF/CR
Sie kommen kontinuierlich mit 57600 baud.
Die Daten sehen z.B. so aus:
DT1,0000,00000AC0,FFFFFFFF,FFFFFFFF,0000043C,00000158,00053FC0,00000030,000014A6,,,00001D2C,BF
BT3,0000,00000AC0,,,0000043C,00000158,00053FC0,00000030,000014A6,00004578
usw...
Mit diesem Code lese ich die Daten ein, was unter "manuellen" Testbedingungen auch einwandfrei funktioniert (Manuell heißt ich schicke dem Mega per Terminal immer eine längere Zeile und schaue, ob er sie als Zeile erkennt):
int ndx = 0; //Index für eingelesene Zeichen
char rc; // Zeichen als Char
int rcint; // Zeichen als ascii
int i; // Zähler
char receivedChars[200]; // Array für die Zeichenkette
boolean newData = false;
void setup() {
Serial.begin(57600); // Serieller Monitor
Serial1.begin(57600); // Eingang Daten
Serial.println ("Start...");
}
void loop()
{
while (Serial1.available())
{
rc = Serial1.read(); //Zeichen einlesen
rcint=rc; //ascii wert des aktuellen Zeichens
receivedChars[ndx] = rc; //Zeichen in Array ablegen
ndx++;
if (rcint==13) // Prüfen, ob Zeilenende erreicht ist, dann Zeile Auswerten
{
newData = true;
Serial.println ("Zeile empfangen: ");
}
}
while (newData) // Auswertung wenn neue Daten da sind
{
i=0;
while (i<ndx)
{
Serial.print (receivedChars [i]);
i++;
}
Serial.println ();
ndx=0;
newData = false;
}
}
Ergebnis (fünf mal ein und die selbe Zeile per Hand geschickt):
Start...
Zeile empfangen:
DT1,0000,00000AC0,FFFFFFFF,FFFFFFFF,0000043C,00000158,00053FC0,00000030,000014A6,00004578,0000090C,00001D2C,BF
Zeile empfangen:
DT1,0000,00000AC0,FFFFFFFF,FFFFFFFF,0000043C,00000158,00053FC0,00000030,000014A6,00004578,0000090C,00001D2C,BF
Zeile empfangen:
DT1,0000,00000AC0,FFFFFFFF,FFFFFFFF,0000043C,00000158,00053FC0,00000030,000014A6,00004578,0000090C,00001D2C,BF
Zeile empfangen:
DT1,0000,00000AC0,FFFFFFFF,FFFFFFFF,0000043C,00000158,00053FC0,00000030,000014A6,00004578,0000090C,00001D2C,BF
Zeile empfangen:
DT1,0000,00000AC0,FFFFFFFF,FFFFFFFF,0000043C,00000158,00053FC0,00000030,000014A6,00004578,0000090C,00001D2C,BF
So weit alles bestens, aber wenn ich jetzt an das Gerät gehe, werden die Daten nicht vernünftig hintereinand eingelesen. Nach einer Weile hängt der Arduino dann ganz an irgend einer Stelle.
Hier habe ich zum Testen einmal den oben benutzten String fünf mal hintereinander über eine Datei an den Arduino geschickt. Die erste Zeile liest er noch richtig, dann fehlen plötzlich Stellen aus dem String:
Start...
Zeile empfangen:
DT1,0000,00000AC0,FFFFFFFF,FFFFFFFF,0000043C,00000158,00053FC0,00000030,000014A6,00004578,0000090C,00001D2C,BF
Zeile empfangen:
DT1,0000,00000AC0,FFFFFFFF,FFFFFFFF,0000043C,00000158,00053FC0,00030,000014A6,00004578,0000090C,00001D2C,BF
Zeile empfangen:
DT1,0000,00000AC0,FFFFFFFF,FFFFFFFF,0000043C,00000158,00053FC0,00004578,0000090C,00001D2C,BF
Zeile empfangen:
DT1,0000,00000AC0,FFFFFFFF,FFFFFFFF,0000043C,00000158,00053FC0,0004578,0000090C,00001D2C,BF
Zeile empfangen:
DT1,0000,00000AC0,FFFFFFFF,FFFFFFFF,0000043C,00000158,00053FC0,0004578,0000090C,00001D2C,BF
Wer hat einen Tipp, was ich da falsch mache?
Vielen Dank und viele Grüße
Ernst