www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu \r im UART


Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo

ich habe in einem UART Beispielprogramm (bei dem Interrupt Kapitel hier 
auf der Seite) gesehen das \r als Stringenede Markierung verwendet wird. 
Das \r wird in eine uint8_t Variable kopiert. Aber \r sind doch zwei 
Zeichen, also einmal das "\" und einmal das "r" und somit 2 Byte?

Kann mir das jemand erklären?

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
'\r' in C-Code beschreibt das Zeichen "carriage return", hex 0x0D,
dezimal 13.

Autor: Random ... (thorstendb) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt eine Vielzahl wichtiger solcher sog. ESCAPE-Controlsequenzen. 
Wichtig ist, dass diese im Programmcode in single-quotes (') verwendet 
werden, genau so, als würde man z.B. 'A' oder 65 zuweisen. Der Compiler 
erkennt dies und setzt den entsprechenden Zahlenwert dafür ein. Das 
Programm wird dadurch lesbarer.

Für das Ende einer Zeichenkette wird idR. '\0' (HEX 0x00) verwendet. 
'\r' steht für Carriage Return (Wagenrücklauf, zurück an den Anfang der 
Zeile), und '\n' steht für newline (eine zeile tiefer).
Andere sind z.B. '\t' für TAB.

In printf erzielt man mit '\n' meist ein CR + LF, das ist aber 
betriebssysteminterpretation. M$, Linux und MAC-OS benötigen alle 
verschiedene Kombinationen aus CR und LF für "Neue Zeile, Vursor an 
Anfang".

Für simples printf-retargeting (ARM) findet man daher häufig:
int fputc(int c, FILE *f)
{
  if(c=='\n')
  {
    wait_for_uart_ready();
    uart_data = '\r';
  }
  wait_for_uart_ready();
  uart_data = c;
} 

Was das Problem auch dahingehend abfängt, dass ein zusätzliches CR nicht 
schadet :-)

Greetz,
/r.

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

Bewertung
0 lesenswert
nicht lesenswert
Marco wrote:

> Das \r wird in eine uint8_t Variable kopiert. Aber \r sind doch zwei
> Zeichen, also einmal das "\" und einmal das "r" und somit 2 Byte?


Da das noch nicht 100% klar und eindeutig herausgekommen ist:

'\r' ist genauso 1 Zeichen, so wie  'a' 1 Zeichen ist!

Die Schreibweise mit \ und einem zusätzlichen Buchstaben, wird
für Zeichen benutzt, für die es keinen Buchstaben gibt. Wie willst
du einen Tabulator symbolisieren. Oder das Zeichen, welches ein
Terminal zur Abgabe eines Beep bringt? Es gibt dafür kein
sichtbares, anzeigbares Zeichen. Also muss man sich was dafür
einfallen lassen.

   \r       carriage return   ( Wagenrücklauf )
   \n       line feed         ( Zeilenvorschub )
   \a       bell              ( Klingen )
   \t       tabulator
   \\       ein einzelner Backslash
   ...

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank!

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.