Forum: Mikrocontroller und Digitale Elektronik Problem mit scanf und zu kurzem Befehl


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Michael F. (michael_f268)


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

von Michael B. (laberkopp)


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.

von Klaus (feelfree)


Lesenswert?

Michael F. schrieb:
> if (rx_counter0)
> {
> scanf("%8s", commandBuffer);
> }

Sieht doch so aus, als stünde in rx_counter0 sowieso die Anzahl der 
empfangenen Bytes? Dann sollte man halt nicht versuchen, 8 Zeichen 
einzulesen, wenn weniger übertragen wurden...

von Steve van de Grens (roehrmond)


Lesenswert?

Michael F. schrieb:
> Wie kannn ich möglichst einfach die scanf-abändern,

Gar nicht. Du musst mit Timeouts arbeiten.

von Peter D. (peda)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.