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
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.
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...
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.
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); }
meinte getkey;) signed char _getkey (void) { char c; while (!ASCx_RIC_IR); c = (char) ASCx_RBUF; ASCx_RIC_IR = 0; return (c); }
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.
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)
ich verwende folgende globale variable im interrupt und in einer funktion, muss diese mit atomic geschützt werden?? bit receive_flag = 1;
ich wusste gar nicht das scanf die daten die ankommen wieder zurücksenden an den sender;) warum sowas? mein _getkey funktioniert nun;)
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.