www.mikrocontroller.net

Forum: Compiler & IDEs scanf stürzt bei seriellem Port ab


Autor: Stefan Frings (sfrings)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein mißratener Code sieht so aus:

int number;

int main(void) {
    // initialize the serial port
    initserial();
    // switch LED on
    DDRB |= (1<<PB2);
    PORTB &= ~(1<<PB2);
    // mail loop
    while (1) {
        printf("Enter a number\r\n");
        scanf("%d",&number);
        printf("You entered: %d\r\n",number);
    }
}

Die initserial() Funktion initialisiert den seriellen Port und verbindet 
stdin und stdout damit.

Problem 1:
Sobald ich einen Buchstaben eingebe, scheint das Programm abzustürzen
und sich selbst zu zerstören. Denn nach Strom aus und wieder an geht
nichtmal die LED an. Ich muss dann den Controller neu flashen. Und das
passiert immer, 100% reproduzierbar.  Was ist denn hier falsch?

Problem 2:
Nach Abschluss der Eingabe (\n), müsste scanf abbrechen und dieses 
Zeichen im Puffer belassen. Der zweite und alle folgenden Aufrufe 
müssten also immer wieder abbrechen ohne daß überhaupt auf weitere 
Eingaben gewartet wird - denn ich entferne dieses Zeichen ncith aus dem 
Puffer. Stattdessen verschwindet das Newline Zeichen wie von Geisterhand 
aus dem Puffer, obwohl in der Doku der avr-libc genau das Gegenteil 
ausdrücklich geschrieben steht.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
poset mal deine init!

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

die scanf() benötigt ein File, welches die Funktion ungetc() 
unterschtützt. unget() legt das letzte Zeichen zurück in __file->unget 
und setzt ein flag, damit das mächste getch() es auch zuerst dort 
abholt.

Daraus ergeben sich die Fragen:
 - wie sind deine streams initialisiert ?
 - hast Du ggf. eigene getch() geschrieben, die unget() nicht 
unterstützen ?

Gruß,
Michael

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Frings wrote:

> Nach Abschluss der Eingabe (\n), müsste scanf abbrechen und dieses
> Zeichen im Puffer belassen. Der zweite und alle folgenden Aufrufe
> müssten also immer wieder abbrechen ohne daß überhaupt auf weitere
> Eingaben gewartet wird - denn ich entferne dieses Zeichen ncith aus dem
> Puffer. Stattdessen verschwindet das Newline Zeichen wie von Geisterhand
> aus dem Puffer, obwohl in der Doku der avr-libc genau das Gegenteil
> ausdrücklich geschrieben steht.

Ich hab jetzt nicht die Doku gecheckt.
Aber deine Beschriebung dessen, was scanf beim Einlesen von Zahlen 
machen soll, stimmt so nicht.

Das wurde auch in deinem ursprünglichen Thread schon mal angesprochen: 
Vergiss scanf! Für mehr als ein paar Testprogramme zum persönlichen 
Gebrauch ist das alles nicht geeignet. Wenns eine einigermassen robuste 
Eingabemethode sein soll, die nicht gleich bei jedem falschen Zeichen 
ausser Tritt kommt, führt zunächst mal kein Weg daran vorbei, eine 
komplette Zeile als String zu lesen (mittels fgets oder was du sonst 
hast) und dann erst wenn die komplette Eingabe als String vorliegt, 
diesen String zu zerpflücken. scanf sieht auf den ersten Blick toll aus, 
weil es anscheinend wenig Arbeit macht. Aber spätestens dann, wenn du 
mit Fehlerfällen in der Eingabe klar kommen musst, ist scanf ein 'pain 
in the ass'

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.