www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik scanf abbrechen


Autor: Gerald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, gibt es vielleicht eine möglichkeit ein scanf das auf daten von der 
der seriellen schnittstelle wartet abzubrechen? kann ich vielleicht 
daten in den receive buffer schreiben, auf welche scanf wartet?
ich verwende den XC164 und den Keil Compiler.

lg

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast einen Grund dafür gefunden, warum man (f)scanf NIEMALS direkt 
auf irgendwelche Eingaben loslässt.

Nutze einen Stringpuffer, den Du mit einer selbstgeschriebenen 
Empfangsroutine beschreibst (die Du dann auch nach Deinen Kriterien 
abbrechen kannst) und nutze sscanf, wenn die Daten in diesem 
Stringpuffer "in Ordnung" sind.

Autor: Gerald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie komm ich an den source code von scanf? ich dachte mir ich sende ein 
printf, damit scanf abbrechen kann;) ich muss rausfinden ob scanf auf 
den receive interrupt wartet...kann man den nicht manuell setzen oder 
so?

was meinst du mit "in Ordnung"?

ich werde wohl meine eigene empfangsroutine schreiben müssen...

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

Bewertung
0 lesenswert
nicht lesenswert
Gerald schrieb:
> wie komm ich an den source code von scanf? ich dachte mir ich sende ein
> printf, damit scanf abbrechen kann;) ich muss rausfinden ob scanf auf
> den receive interrupt wartet...kann man den nicht manuell setzen oder
> so?

Du zäumst das Pferd immer noch falsch auf.

>
> was meinst du mit "in Ordnung"?

geprüft, für gültig befunden.
Eine empfangene Eingabe, die wegen Timeout abgebrochen wurde, ist nicht 
in Ordnung.

> ich werde wohl meine eigene empfangsroutine schreiben müssen...

Das ist der Weg.
Wenn du den String komplett hast, kannst du ihn ja mit sscanf zerlegen. 
Aber scanf macht hier ganz einfach zuviel: Auf Benutzereingabe warten 
UND zerlegen.
Und das ist nun mal meistens zu unflexibel für einen Produktionseinsatz.

Autor: Gerald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich übers keyboard in den serial_modus gehe dann wartet er mit 
scanf auf serielle daten... ich will nun das scanf abbrechen/serial 
modus beenden, wenn der user exit drückt. das ist alles;)

auf wie viele zeichen wartet eigentlich das scanf?
scanf ("%s",&str); ...hier wartet scanf auf einen mit \0 terminierten 
string?
und bei scanf ("%i",&int_value); bzw. scanf("%X",&hex_value) ??

woher weiss ich ob scanf den FIFO verwendet?

ich könnte dann ja das putchar modifizieren und sscanf aufrufen?
char putchar (char c)  {
  while (!ASCx_TIC_IR);
  ASCx_TIC_IR = 0;
  return (ASCx_TBUF = c);
}

Autor: Gerald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
meinte getkey;)

signed char _getkey (void)  {
  char c;

  while (!ASCx_RIC_IR);
  c = (char) ASCx_RBUF;
  ASCx_RIC_IR = 0;
  return (c);
}

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weil man sotwas nicht mit scanf macht, gibt es auch keine Möglichkeit es 
abzubrechen.

lege ein Puffer an char[MAX_LEN]
lese die daten mit read bis zu einem Ende oder meintwegen einem Timeout. 
Schon hast du den string da.

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

Bewertung
0 lesenswert
nicht lesenswert
Gerald schrieb:

> auf wie viele zeichen wartet eigentlich das scanf?

scanf wartet nicht auf x Zeichen sondern darauf dass ein Return 
daherkommt. Eigentlich stimmt auch das nicht. Denn es ist die darunter 
liegende Schicht, die solange wartet, bis eine Eingabezeile komplett ist 
(wird am Return festgemacht)

Autor: Gerald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich verwende folgende globale variable im interrupt und in einer 
funktion, muss diese mit atomic geschützt werden??

bit receive_flag = 1;

Autor: Gerald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich wusste gar nicht das scanf die daten die ankommen wieder 
zurücksenden an den sender;) warum sowas?

mein _getkey funktioniert nun;)

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

Bewertung
0 lesenswert
nicht lesenswert
Gerald schrieb:
> ich wusste gar nicht das scanf die daten die ankommen wieder
> zurücksenden an den sender;)

scanf schickt gar nichts zurück.
Wenn dann macht das die unter scanf liegende Schicht, die eine Zeile 
einliest.

> warum sowas?
Damit ein Benutzer sieht was er getippt hat?

Autor: Gerald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,

ich initialisiere meine serielle schnittstelle wie folgt:

 void init_rs232 (void)
   {
  P3_P10 = 1;
  DP3_P10 = 1;
  DP3_P11 = 0;
  ALTSEL0P3_P10 = 1;    // Connect P3.P10 with ASC interface

  ASC0_TIC = 0x80;
  ASC0_RIC = 0x00;
  ASC0_BG  = 0x04;
  ASC0_CON = 0x8011;
  ASC0_CON_S0FDE = 1;    // 0 = fraction divider disabled, 1 = enabled
  ASC0_FDV = 0x76;    // Baudrate
  }

danach sende ich daten an die serielle schnittstelle...der datentransfer 
ist beendet, dann erste rufe ich die funktion _getkey auf!
warum empfängt er dann über ASC0_RBUF den wert 0x000A ?? muss ich vor 
dem _getkey aufruf irgendwas initialisieren?

lg

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.