Problem mit scanf und zu kurzem Befehl

OP #7663751

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

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

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

Eine eigene Frage? Dieser Thread ist über 2 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.