www.mikrocontroller.net

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


Autor: Elektronenbrater (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
    }

  }


}

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Elektronenbrater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Morgen

>>volatile unsigned char UARTBuf[21]


>WOW, was für eine Deklaration!


Was ist den daran falsch? "unsigned" ?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Elektronenbrater (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Elektronenbrater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok Danke für die Tipps

Autor: Frank M. (ukw) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.