Hallo Leute Ich bin C-Anfänger. Mit meine ATMega empfange ich über den UART verschiedene Befehle die ich über ein Terminal an den AVR schicke. Die empfangene Zeichen schaufle ich in einen char-Array Buffer. volatile unsigned char UARTBuf[21] Stimmt es dass ein char-Arry immer mit \r\n abeschlossen wird? In der main-Schleife prüfe ich ständig ob im UARTBuf das Enterzeichen angekommen ist. Wenn es ankommt soll der Befehl abgearbeitet werden. Ich sende z.B. mit dem Terminal "AVR:" + "Enterzeichen" Mein Beispiel funktioniert nicht. Ist dies weil das Char-Array mit "\r" abgeschlossen wird? Mit welchem Befehl muss ich dies tun? Auf eine Antwort würde ich mich freuen. Gruss Elektronenbrater int main(void) { while (1) { char * pos = memchr( UARTBuf, "\r", strlen( UARTBuf ) ); if (pos >1) { //Befehle abarbeiten } } }
@ Elektronenbrater (Gast) >Mit meine ATMega empfange ich über den UART verschiedene Befehle die ich >über ein Terminal an den AVR schicke. Die empfangene Zeichen schaufle >ich in einen char-Array Buffer. >volatile unsigned char UARTBuf[21] WOW, was für eine Deklaration! >Stimmt es dass ein char-Arry immer mit \r\n abeschlossen wird? Nö, in C wird ein String mit \0 abgeschlossen. In normalen Texten auf dem PC sind Zeilenenden mit \r\n abgeschlosen, unter UNIX mit \r >Mit welchem Befehl muss ich dies tun? Dafür gibt es nix explizites. Das muss man "von Hand" machen. Sprich, beim Empfang der Zeichen und speichern im Array muss man schon das \r erkennen und gegen ein \0 ersetzen, sonst wird dein String nicht abgeschlossen. Siehe Interrupt, dort ist ein Beispiel drin, wenn gleich schon etwas komplexer. Kann man aber auch ohne Interrupt machen. MFG Falk
Guten Morgen >>volatile unsigned char UARTBuf[21] >WOW, was für eine Deklaration! Was ist den daran falsch? "unsigned" ?
@ Elektronenbrater (Gast) >>>volatile unsigned char UARTBuf[21] >>WOW, was für eine Deklaration! >Was ist den daran falsch? "unsigned" ? Falsch ist da nix, aber schon sehr "aufwändig". Normalerweise nimmt man char, ob signed oder unsigned ist egal, weil es normalerweise nur für Strings genutzt wird. Will man echt damit rechnen, nimmt man uint8_t oder int8_t. MFG Falk
Ich empfange ja Befehle also Strings, rechnen will ich damit nicht
Elektronenbrater schrieb: > Ich empfange ja Befehle also Strings, rechnen will ich damit nicht Dann nimm plain vanilla char char .... für alles was mit Texten zu tun hat uint8_t (oder unsigned char) .... für einen kleinen Integer OHNE Vorzeichen (vulgo: ein Byte) int8_t (oder signed char) .... für einen kleinen Integer MIT Vorzeichen
Falk Brunner schrieb: > In normalen Texten auf dem PC sind Zeilenenden mit \r\n abgeschlosen, > unter UNIX mit \r Sorry, unter UNIX ist am Zeilenende ein \n und kein \r. > Sprich, beim Empfang der Zeichen und speichern im Array muss man schon > das \r erkennen und gegen ein \0 ersetzen, sonst wird dein String nicht > abgeschlossen. [...] Das stimmt aber wieder, da ein Terminal bzw. eine Terminalemulation bei Drücken der Enter-Taste (korrekterweise muss es RETURN-Taste heissen) tatsächlich ein \r und nicht ein \n sendet. Gruß, Frank
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.