Forum: Mikrocontroller und Digitale Elektronik scanf abbrechen


von Gerald (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Gerald (Gast)


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...

von Karl H. (kbuchegg)


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.

von Gerald (Gast)


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);
}

von Gerald (Gast)


Lesenswert?

meinte getkey;)

signed char _getkey (void)  {
  char c;

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

von Peter (Gast)


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.

von Karl H. (kbuchegg)


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)

von Gerald (Gast)


Lesenswert?

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

bit receive_flag = 1;

von Gerald (Gast)


Lesenswert?

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

mein _getkey funktioniert nun;)

von Karl H. (kbuchegg)


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?

von Gerald (Gast)


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

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.