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

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