Problem mit scanf und zu kurzem Befehl

OP #7663751
Lesenswert?

Hallo zusammen,

auf einem Atmega644 bekomme ich per serieller Schnittstelle einen normalerweise 8-stelligen Befehl, den ich über scanf einlese. Solange der Befehl genau 8 oder mehr Zeichen hat, funktioniert alles gut, wenn der Befehl, evtl. auf aufgrund eines Übertragungsfehlers, nur 7 Zeichen hat, hängt sich meine Anwendung auf.

char commandBuffer[COMMAND_LENGTH]; memset(commandBuffer, 0, sizeof(commandBuffer));

if (rx_counter0) { scanf("%8s", commandBuffer); }

Wie kannn ich möglichst einfach die scanf-abändern, damit das Gerät nicht in einer Dauerschleife bleibt? Anscheind wartet scanf auf das achte Zeichen, dass nicht kommt.

Vielen Dank schon mal für eure Hilfe Michael

#7663803
Lesenswert?

Michael F. schrieb:

Wie kannn ich möglichst einfach die scanf-abändern, damit das Gerät nicht in einer Dauerschleife bleibt

Gar nicht.

So lange du kein Endezeichen hast, wie \r\n , weiss er ja nicht dass nach 7 Zeichen Ende sein soll.

Es gibt Systeme mit Timeout, z.B. MODBUS, wenn da die Pause nach einem Zeichen zu lang wird, interpretiert man das als Übertragungsende, aber das kann scanf nicht.

#7664127
Lesenswert?

scanf liest von stdin und ist damit von dessen Implementierung abhängig. Du mußt Dir zuerst ein Protokoll ausdenken, woran Deine Empfangsroutine eindeutig das Ende einer Nachricht erkennen kann. Und dann liest Du die Nachricht in einen Puffer ein und übergibst den Puffer an sscanf. sscanf wartet nicht, sondern gibt die Anzahl fehlerfrei gelesener Argumente zurück.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren