UART Text empfangen [Peter Fleury]

OP #2494618
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?
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
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?
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.
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
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 ??!?!
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.