Go Down

Topic: Seriellen String einlesen (Read 2263 times) previous topic - next topic

ste_85

Hallo,

ich versuche einen String einzulesen, der immer die gleiche Zeichenlänge hat.
Es handelt sich hierbei um 4 HEX Werte.
Die ersten beiden Zeichen geben an, welche Funktion gewählt werden soll. (00 - FF).
Die anderen 6 Zeichen geben ebenfall Parameter im Bereich von 0 -255 wieder.
Nach den 8 Zeichen kommt dann ein NL. Sollten nicht alle Zeichen angekommensein, und das NL kommt, soll der Inhalt verworfen werden.

Jedoch funktioniert das bei mir noch nicht so wirklich, Tipps?

Code: [Select]
char string[9];
char stringOk[9];
boolean ok = false;
int i = 0;

void setup(void)
{
Serial.begin(9600);
}

void loop(void)
{
while(Serial.available())
{
string[i] = Serial.read();
if(string[i] == '\n' && i == 8)
{
for(int j = 0; i < 9; j++)
{
Serial.print(string[j]);
}
Serial.print("\n");
i = 0;
memcpy(stringOk, string, 9);
ok = true;
memset(string, 0, 0);
}
else if(string[i] != '\n' && i < 8)
{
i++;
}
else
{
Serial.print("ERROR \n");
i = 0;
memset(string, 0, 0);
}
}

if(ok == true)
{
ok = false;
// parsen
}
}

jurs


Jedoch funktioniert das bei mir noch nicht so wirklich, Tipps?


Mit dem Code nach dieser Bauart:
Code: [Select]

while(Serial.available())
{
           // tu was
}

verarbeitest Du in aller Regel genau EIN einziges Zeichen.

Und zwar weil Serial schnarchlangsam ist. D.h. beim Eintritt in diese while-Schleife ist ein Zeichen im Puffer, und wenn die Schleife zum ersten mal abgearbeitet ist, ist kein Zeichen mehr im Puffer. Weil das Abarbeiten der Schleife viel schneller ist als die Zeit, um das nächste Zeichen über Serial zu senden.

Am einfachsten wäre die Programmlogik, wenn das Einlesen eine gewisse Zeit dauern dürfte.

Zum Beispiel mit dieser Logik:
Code: [Select]

  if (Serial.available()
  {
delay(10);
while(Serial.available())
{
           // tu was
}
  }


Dann würde das delay(10) dafür sorgen, dass erstmal die Zeile empfangen wird, bevor Du mit der Verarbeitung loslegst.

uwefed

äh

Sind es nun 4 Hex-Werte (ich nehme mal an zu 2 Stellen) oder acht 1 Byte Zahlen???

Code: [Select]
for(int j = 0; i < 9; j++)
{
Serial.print(string[j]);
}


i oder j oder beides? sowas nennt sich unendliche Schleife und ist mit for ( ; ; ) einfacher zu schreiben   ;) ;) ;) ;)

Grüße Uwe

Serenifly

Du solltest auch beachten dass Strings in C Null-terminiert sind! Das heißt für 9 Zeichen muss das Array 10 groß sein, und am Ende muss 0, bzw. '\0' stehen. Dann kann man auch statt memcpy() strcpy() verwenden.

Und du verwendest memset() falsch:
Code: [Select]

memset(string, 0, 0);

Der 3. Parameter ist die Länge des Array in Bytes:
http://www.cplusplus.com/reference/cstring/memset/

Go Up