Scanf Funktion in UART

OP #6949973
Lesenswert?

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
Gast #6950113
Lesenswert?

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.
Gast #6950290
Lesenswert?

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
int _write(int file, char *ptr, int len)
2
{
3
    for (int i=0; i<len; i++)
4
    {
5
        // Warte, bis das Sende-Register Platz hat
6
        while(!(USART2->SR & USART_SR_TXE));
7
        USART2->DR = *ptr++;
8
    }
9
    return len;
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
int _read(int file, char *ptr, int len) 
2
{
3
    if (received_something)
4
    {
5
        *ptr = the_received_character;
6
        return 1;
7
    }
8
    else
9
    {
10
        return 0;
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.
Gast #6950494
Lesenswert?

>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
Lesenswert?

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.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren