Forum: Compiler & IDEs Wie kann ich Enter im Uart Abfangen?


von Elektronenbrater (Gast)


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
    }

  }


}

von Falk B. (falk)


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

von Elektronenbrater (Gast)


Lesenswert?

Guten Morgen

>>volatile unsigned char UARTBuf[21]


>WOW, was für eine Deklaration!


Was ist den daran falsch? "unsigned" ?

von Falk B. (falk)


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

von Elektronenbrater (Gast)


Lesenswert?

Ich empfange ja Befehle also Strings, rechnen will ich damit nicht

von Karl H. (kbuchegg)


Lesenswert?

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

von Elektronenbrater (Gast)


Lesenswert?

Ok Danke für die Tipps

von Frank M. (ukw) (Moderator) Benutzerseite


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

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
Noch kein Account? Hier anmelden.