Forum: Mikrocontroller und Digitale Elektronik UART Text empfangen [Peter Fleury]


von André R. (andr_r23)


Lesenswert?

Ich habe die UART Lib vom Fleury. Ausgaben jeglicher Art funktionieren 
Problemlos und sind auch im Terminal lesbar.

Jetzt möchte ich etwas eingeben und empfangen... der Fleury hat jetzt 
dort eine Funktion getc für getchar geschrieben. Wie genau kann ich dann 
einen ganzen String empfangen? Gibt es dafür keine Funktion?

von Karl H. (kbuchegg)


Lesenswert?

André R. schrieb:

> dort eine Funktion getc für getchar geschrieben. Wie genau kann ich dann
> einen ganzen String empfangen? Gibt es dafür keine Funktion?


Kann es nicht geben.
Weil wohl jeder eine andere Vorstellung davon hat, wann genau denn ein 
String zu Ende ist.

Eine übliche Konvention ist es zb, eine komplette Zeile zu empfangen 
(also alles bis zum \n). Aber auch das musst du dir selber schreiben, 
weil es in C nun mal das Problem gibt, wie man einen String sauber aus 
einer Funktion herausbekommt und nicht klar ist, was die Funktion dann 
im Fehlerfall eigentlich machen soll.

Soll heißen: Im allgemeinen Fall. Im speziellen Fall, im Kontext eines 
Programms hingegen ist das meistens wieder leicht zu entscheiden.

von Hubert G. (hubertg)


Lesenswert?

Du liest den Buffer so lange aus bis er leer ist.
Ist im test_uart.c angeführt.

von André R. (andr_r23)


Lesenswert?

Ich finde in der uart_test nicht. Bin halt auch noch Anfänger und 
versteh das ganze noch nicht so wirklich ...

Nun habe ich soetwas gefunden 
(http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Der_UART)

void uart_gets( char* Buffer, uint8_t MaxLen )
{
  uint8_t NextChar;
  uint8_t StringLen = 0;

  NextChar = uart_getc();
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
    *Buffer++ = NextChar;
    StringLen++;
    NextChar = uart_getc();
  }
  *Buffer = '\0';
}

Aufruf erfolgt wie im Beispiel mit:
 uart_gets( Line, sizeof( Line ) );

Dann sagt er mir aber:

Error  1  expected declaration specifiers or '...' before 'uint8_t'
Error  2  too many arguments to function 'uart_gets'

Das Beispiel müsste ja eigtl richtig sein ... was kann falsch sein?

von Stefan E. (sternst)


Lesenswert?

André R. schrieb:
> Das Beispiel müsste ja eigtl richtig sein ... was kann falsch sein?

Du hast wohl stdint.h nicht eingebunden.

Der Code funktioniert so wie er ist bei dir aber eh nicht, weil die 
Fleury uart_getc nicht blockierend arbeitet, also nicht auf das 
Eintreffen eines Zeichens wartet. Die komplette Zeile müsste also schon 
garantiert empfangen und im Puffer sein, damit diese Funktion 
funktionieren kann.

von Karl H. (kbuchegg)


Lesenswert?

Stefan Ernst schrieb:
> André R. schrieb:
>> Das Beispiel müsste ja eigtl richtig sein ... was kann falsch sein?
>
> Du hast wohl stdint.h nicht eingebunden.
>
> Der Code funktioniert so wie er ist bei dir aber eh nicht, weil die
> Fleury uart_getc nicht blockierend arbeitet, also nicht auf das
> Eintreffen eines Zeichens wartet. Die komplette Zeile müsste also schon
> garantiert empfangen und im Puffer sein, damit diese Funktion
> funktionieren kann.

Entweder das oder man baut sich mit der Fleury uart_getc eine wartende 
Version, was so weiter nicht schwer ist (umgekehrt wärs unangenehmer)

von André R. (andr_r23)


Lesenswert?

void uart_gets( char* Buffer, uint8_t MaxLen ) ging nicht
void uart_gets(char* Buffer, uint8_t MaxLen ) geht ohne das ein Fehler 
auftaucht.

Es war das Leerzeichen vor Char*... Ich geh nach Hause den Fehler 
verstehe ich nicht, bin zu blöd dazu. Seit wann sind Leerzeichen an 
dieser Stelle relevant ??!?!

von Karl H. (kbuchegg)


Lesenswert?

André R. schrieb:
> void uart_gets( char* Buffer, uint8_t MaxLen ) ging nicht
> void uart_gets(char* Buffer, uint8_t MaxLen ) geht ohne das ein Fehler
> auftaucht.
>
> Es war das Leerzeichen vor Char*...

ganz sicher nicht.


Edit: Was eventuell sein könnte ist, dass du da mit deinem Editor 
irgendwie ein nicht druckbares Zeichen eingeschummelt hast. Aber die 
Chancen dafür sind eher gering.

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.