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
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.
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...
Michael F. schrieb: > Wie kannn ich möglichst einfach die scanf-abändern, Gar nicht. Du musst mit Timeouts arbeiten.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.