2017-03-10 7 views
0

Ich habe einen Treiber für einen UART, der eine Datenfolge für die serielle Konsole liest, bis der Benutzer 'l' eingibt. Ich möchte jedoch nur ein einziges Zeichen lesen. Es ist für ein Menü, wo der Benutzer 1-9 oder a-z eingibt. Ich versuche, ein Äquivalent des Standards C getchar() zu schaffen. Wie könnte ich das generell machen?Ein UART-Treiber emuliert getchar()

Dies ist die Registerkarte für den UART.

enter image description here

void getstring(char *str) { 

    volatile uint32_t *uart = (volatile uint32_t*) UART; 
    char c = 0; 

    do { 
     while ((uart[2] & (1<<7)) == 0); 
     c = uart[0]; 
     *str++ = c; 
    } 
    while (c!='l'); 
} 
+2

Wir sind keine Codierung/Nachhilfe-Service. Was ist dein ** spezifisches ** Problem? Stellen Sie eine [mcve] bereit. – Olaf

+1

Refactor einfach diese Funktion, bewegen Sie den Code innerhalb der Schleife in eine getchar() -Funktion. Die 'uart'-Deklaration ist fehlerhaft, sie muss' uint16_t' sein, um der Registergröße zu entsprechen. –

+0

Diese 'getstring()' Implementierung ist unsicher und schlecht beraten. Es hat keine Begrenzung für die Anzahl der Zeichen, die in 'str' geschrieben werden, beendet die Zeichenfolge nicht und enthält das Zeichen' l', das zum Beenden des Eintrags verwendet wird. – Clifford

Antwort

0

Die Schleife ruft zu einem Zeitpunkt, in einer Schleife um ein Zeichen. Wenn Sie nur ein einzelnes Zeichen wünschen, dann lassen Sie einfach die äußere Schleife aus.

char getch() 
{ 
    volatile uint32_t *uart = (volatile uint32_t*) UART; 
    while ((uart[2] & (1<<7)) == 0); 
    return uart[0]; 
} 

Es macht dann Sinn, diese Funktion neu schreiben getstring() mit (mehr wartbar).