Hallo, ich hätte eine Frage. Kann man für UART eine scanf Funktion einbauen? Z.B für meinen Fall, dass ich Auswahloptionen 1, 2 und 3 habe und ich dann im Terminal z.B. 1 eingeben will, das ich in den nächsten Modus komme. Gibt es so eine Möglichkeit? Danke für alle Antworten. Mfg, Srdjan
Ja, man kann. Oliver
Hast du einen Beispielcode vielleicht dafür? LG
Für diesen Fall ist scanf viel zu oversized. Bei einem Zeichen kann man zeichen -'0' rechnen.
1 | |
Genaueres verrät dir die Doku zu deinem System. Oliver
Okay, vielen Dank!
In der Doku find ich nichts, das ist ja eine JAVA Funktion.
Srdjan S. schrieb: > In der Doku find ich nichts, das ist ja eine JAVA Funktion. Und das passt nicht?
Ne, ich arbeite mit C. Vergessen zu erwähnen, sorry.
Wir reden von einer 32bit maschine, gell ? Allenfalls ein Linux, oder RTOS dabei ?
Gast
#6950113
Falls du es immer noch nicht mitbekommen hast: der C-Standard kennt keine UARTS - wie man ein File-Handle für eine UART erzeugt ist Systemabhängig und zu deinem System hast du bisher nichts gesagt. Falls es ein Atmel mit avr-libc ist, schau mal nach FDEV_SETUP_STREAM.
Srdjan S. schrieb: > In der Doku find ich nichts, das ist ja eine JAVA Funktion. Aha. Du hast den Hinweis also verstanden. Die Funktion musst du schon selber schreiben, und wie, verrät dir die Doku zu deinem System, welches ja nur du kennst. Oliver
Gast
#6950221
Srdjan S. schrieb: > Hast du einen Beispielcode vielleicht dafür? http://stefanfrings.de/avr_hello_world/index.html
Tut mir Leid für die schlechte Fragenbeschreibung. Ich arbeite mit einem STM32F4.. Mikrocontroller.
Gast
#6950290
Srdjan S. schrieb: > Ich arbeite mit einem STM32F4.. Mikrocontroller. Für Ausgabe mit printf() und puts() musst du die C-Funktion _write() implementieren. Ein Beispiel ohne Sende-Puffer:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
Die C-Bibliothek puffert Textausgaben schon von sich aus bis zum Zeilenumbruch oder flush(). Für die umgekehrte Richtung muss du die Funktion _read() implementieren. Dafür habe ich kein Beispiel parat, deswegen hier ein unvollständiger Pseudo-Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
Oder du empfängst viele Zeichen in einer for Schleife (maximal so viele wie "len" vorgibt). Beides funktioniert. Für den Empfang empfehle ich dringend einen Puffer mit Interrupt-Handler.
Vielen Daaank!
Allenfalls waere es einfacher die paar Register und die funktionalitaet des UARTs im Kontext der CPU nachzuschauen. Es sind dann nur vielleicht 20 Zeilen Code.. dabei lernst du noch zu nicht-blockierendem Code zu denken. Waehrend ein sscanf eben doch meist blockierend ist.
Gast
#6950494
>Kann man für UART eine scanf Funktion einbauen? Ja selbstverstaendlich. Z.B: Greif zu einem Motorola 68360 oder einem TI TMS320F069. Beide haben echt parallel arbeitende IO-Prozessoren. Die koennen natuerlich so ein pillepalle scanf locker nebenbei abhandeln. Es duerfen sogar mehrere UARTs sein, um den Luxus zu komplettieren. Top-Hersteller wie Cisco vertrauen dem 68360. Und lass dich nicht von den Laien hier verwirren, die soetwas natuerlich nicht kennen.
Gast
#6950600
Pandur S. schrieb: > Waehrend ein sscanf eben doch meist blockierend ist. Das ist der Grund, warum es nur sehr selten benutze. Wenn man den UART Empfänger mit Puffer und Interrupt ausstattet, könnte man sich eine Funktion has_linefeed_in_rx_buffer() basteln und scanf nur dann aufrufen, wenn sich ein \n im Puffer befindet. Man muss dann aber auch garantieren, dass dieses Zeichen im Puffer bleibt, nicht dass es zwischenzeitlich aus irgend einem Grund verschwindet, z.B. weil man weitere Zeichen empfängt die zum Überlauf führen.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.