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.
Du liest den Buffer so lange aus bis er leer ist. Ist im test_uart.c angeführt.
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)
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.