Wie kann ich Enter im Uart Abfangen?

Gast #1866828
Lesenswert?
• ▲
▼
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
    }

  }


}
#1866862
Lesenswert?
• ▲
▼
@  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
#1867088
Lesenswert?
• ▲
▼
@  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
Moderator Persönliche Seite #1868055
Lesenswert?
• ▲
▼
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.