UART Text empfangen [Peter Fleury]

OP #2494618
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?
#2494625
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.
OP #2494732
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?
#2494767
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.
#2494793
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)
OP #2494811
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 ??!?!
#2494831
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.

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