Forum: Mikrocontroller und Digitale Elektronik carriage return problem


von Timebeast (Gast)


Lesenswert?

Moin,
in aller Kürze, warum macht kein Terminal Programm einen  carriage 
return (\r) alleine, sondern immer  carriage return line feed (\r\n), 
und wie kann man das umgehen?

Eigendlich unnötige Informationen:
AVR, Tiny2313, Atmel Studio 6.0, Terminal Programme: Bray Terminal, AVR 
Studio Terminal

BrayTerminal erkennt mir wenigstens noch die Escape-Sequenzen "\b", also 
ein Zeichen zurück auf der gleichen Zeile, das Studio Terminal kann 
nicht mal das.

Grüsse
Ralf

von Klaus D. (kolisson)


Lesenswert?

HTERM kann das !

Gruss K.

von Peter II (Gast)


Lesenswert?

es gibt dafür halt Standards.

http://tools.ietf.org/html/rfc854

oder wenn es etwas mehr sein soll:

http://de.wikipedia.org/wiki/Tn3270

von Timebeast (Gast)


Lesenswert?

@ Klaus De lisson
danke, werd ich ausprobieren, obwohl HTerm vor Urzeiten aus meiner Liste 
der nutzbaren Tools ausgeschieden ist, warum weiß ich nicht mehr, ist 
halt länger als 10 Jahre her.

@ Peter II
Genau, Standarts, "\r" = Carriage Return, "\n" = new line. Sind die 
Standarts heute wirklich so "\r" = "\r\n" und "\n" auch "\r\n".
Vielen Dank im übrigen für die geschätzten 300 Seiten Standart 
Beschreibung, erwartest Du ganz ehrlich das man das alles ließt, wenn 
man "Hello World" auf der Konsole ausgeben möchte???
(In meinem Fall halt "Hello\r World" = "World")

von L. P. (lpg)


Lesenswert?

Nimm HTerm!
Da kannst du das enstellen, welches Zeichen er als Terminator schickt.

http://www.der-hammer.info/terminal/

lg

von Peter II (Gast)


Lesenswert?

Timebeast schrieb:
> Vielen Dank im übrigen für die geschätzten 300 Seiten Standart
> Beschreibung, erwartest Du ganz ehrlich das man das alles ließt, wenn
> man "Hello World" auf der Konsole ausgeben möchte???

eigentlich schon, denn dann weis man wie man es zu machen hat. Sonst ist 
es doch nur ein trial and error und beim nächsten Programm geht es schon 
wieder nicht.

Man kann sich auch nur die betreffenden Abschnitte durchlesen.

Bei HTTP ist es auch nicht anders, dort musst du mit \r\n arbeiten, 
sonst es es kein HTTP.

von Timebeast (Gast)


Lesenswert?

So, HTerm bereit, und was soll ich sagen, es geht trotzdem nicht.
Also man kann mit "New Line at" angeben ob bei "CR" (Carriage Return -> 
"\r") oder bei "LF" (Line Feed -> "\r") in eine neue Zeile gesprungen 
werden soll.
Das klappt auch, sowohl bei CR als auch bei LF. Sprich, beide 
Escape-Sequenzen werden richtig erkannt und interprtiert.

ABER, das er macht keinen Carriage Return!
Was nun?

von Ulrich B. (ulrich_b18)


Lesenswert?

Nimm TeraTerm, da kann man unter Setup/Terminal einstellen, ob CR oder 
CR/LF gesendet werden soll.

Gruß,
Ulrich

von Klaus D. (kolisson)


Lesenswert?

nee nee ,, bezüglich Htmerm.
Das hat nix mit "new line at" zu tun.
Unten im Programm "send on Enter" wäre mein Kandidat.
Allerdings solltest du jetzt mal langsam sagen ob es um welche Richtung 
es dir geht. PC->uC oder umgekehrt.

Gruss Klaus

von Timebeast (Gast)


Lesenswert?

Vorweg, "ABER, das er macht keinen Carriage Return!" sollte natürlich 
"ABER, er macht keinen Carriage Return!" heissen.

@Ulrich B.
Danke, erstmal für den Versuch.
"...ob CR oder CR/LF gesendet..." es geht ja nicht um senden, sondern 
empfangen, und beim Empfangen kann man leider wieder nur einstellen bei 
welcher Escape-Sequenz in eine neue Zeile gesprungen werden soll.
Auch hier ist es wie bei HTerm, sende ich ein "\r" erkennt er dies als 
"CR", sprich wenn ich einstelle das er bei "CR" in eine neue Zeile 
springen soll, macht er das.
Aber, ein Carriage Return, also zurück springen an den Anfang der Zeile 
wird nicht ausgeführt.

von Timebeast (Gast)


Lesenswert?

@Klaus De lisson
oh mein Gott, stimmt, auf die Idee das man auch verstehen könnte das 
mich LineFeeds auf dem uC stören würden bin ich gar nicht gekommen, 
sorry!

Es geht natürlich darum, das ich einen String vom uC sende, und auf dem 
PC anzeigen lasse.
Jetzt schreibt er mir allerdings jeden Wert (es sind Strings) in eine 
neue Zeile und das macht die Sache komplett unleserlich.

von Peter D. (peda)


Lesenswert?

Ich hab mir für MC-Anwendungen folgende Konvention angewöhnt:

Der MC sendet immer ein "\r\n" am Ende.

Der MC empfängt eine Zeile, wenn "\r" oder "\n" erkannt wird.
Ein nachfolgendes "\r" oder "\n" allein wird ignoriert.

von Timebeast (Gast)


Lesenswert?

Hallo Peter,
"Der MC empfängt eine Zeile..." für meinen Fall egal.

"Der MC sendet immer ein "\r\n" am Ende."
Deine Konvention entspricht einem "an Zeile Anfang springen" ("\r") 
gefolgt von einer neuen Zeile ("\n").
Überraschung, das brauchst Du gar nicht zu tun. Ein einfaches "\r" oder 
"\n" reicht für dieses Verhalten in Terminal Programmen (auf dem PC) 
völlig aus.

Mich intressiert eher Deine Konvention, wenn Du auf dem Terminal 
Programm  immer in die selbe Zeile schreiben willst.

von Jörg E. (jackfritt)


Lesenswert?

Ich empfange die Daten mit Putty und nutze für die cursorsteuerung die 
entsprechenden
Steuercodes der in Putty eingestellten terminalemulation.

von Ulrich B. (ulrich_b18)


Lesenswert?

Um immer in dieselbe Zeile zu schreiben würde ich eher eine ANSI-Escape 
Sequenz nehmen, z.B. CSI n G Cursor Horizontal Absolute (Moves the 
cursor to column n.)

Gruß,
Ulrich

von Berger (Gast)


Lesenswert?

L. P. schrieb:
> Nimm HTerm!
> Da kannst du das enstellen, welches Zeichen er als Terminator schickt.
>
> http://www.der-hammer.info/terminal/



Das ist eine Beta-Version aus dem Jahr 2006!

von Klaus D. (kolisson)


Lesenswert?

Timebeast schrieb:
> @Klaus De lisson
> oh mein Gott, stimmt, auf die Idee das man auch verstehen könnte das
> mich LineFeeds auf dem uC stören würden bin ich gar nicht gekommen,
> sorry!

also mir ist immer noch nicht klar was du eigentlich willst.
Du sendest etwas vom uC an den PC und es stört dich das LF.
Warum sendest du da LF denn dann ?

... oder willst du so ein quasistatisches Terminalbild mit festen 
Positionen auf dem PC Schirm ? Dann musst du wohl mit den esc-Sequenzen 
a la VT100 arbeiten.

Bisher machst du mir Rätsel.

Gruss Klaus

von Peter D. (peda)


Lesenswert?

Timebeast schrieb:
> Überraschung, das brauchst Du gar nicht zu tun. Ein einfaches "\r" oder
> "\n" reicht für dieses Verhalten in Terminal Programmen (auf dem PC)
> völlig aus.

Z.B. Hyperterminal ist da anderer Meinung.

Timebeast schrieb:
> Mich intressiert eher Deine Konvention, wenn Du auf dem Terminal
> Programm  immer in die selbe Zeile schreiben willst.

Wozu sollte ich das tun?

"\b \b" löscht ein Zeichen sichtbar.

von Gelacht (Gast)


Lesenswert?

Die Chemnitzer können zwar besser russisch als englisch (Kodes, Kursor), 
aber die Anleitung ist gar nicht schlecht:
http://www-user.tu-chemnitz.de/~heha/hs/terminal/terminal.htm

von Timebeast (Gast)


Lesenswert?

@ Jörg Esser
Du benutzt einen Telnet-Client um mit einem Tiny AVR über RS232 zu 
kommunizieren. Ich meine, klar, kann man machen. Putty stand im übrigen 
wie schon HTerm und ich glaube HyperTerminal (war zu Win98 zeiten halt 
Boardwerkzeug) auf der Liste der nicht so tollen Programme für RS232 
Kommunikation. Aber nunja, Versuch macht kluch, oder so ;-)

@ Berger
"Beta-Version aus dem Jahr 2006"
...und damit gehört es noch zu den modernsten Programmen dieser Art.

@ Ulrich B.
ANSI-Escape Sequenz, so so, und das wird auch von allen Terminal 
Programmen unterstützt? Welchen String soll ich denn mal versuchsweise 
an mein Terminal Programm schicken?

von Gelacht (Gast)


Lesenswert?

Timebeast schrieb:
> ANSI-Escape Sequenz, so so, und das wird auch von allen Terminal
> Programmen unterstützt? Welchen String soll ich denn mal versuchsweise
> an mein Terminal Programm schicken?

Wenn du mit einem Terminal kommunizieren willst dann halte dich an den 
Standard. Siehe meinen Link oben.
Ansonsten ist das Mittel der Wahl sich ein eigenes Protokoll zu basteln 
und die PC Anwendung selbst zu schreiben.

von Timebeast (Gast)


Lesenswert?

Und wie ich oben schon schrieb halte ich mich ja an den Standart:
"\r" = Carriage Return
"\n" = new Line

Die Terminal Programme interpretieren den "Standart" allerdings 
anscheinend anders in dem sie "\r" als "\r\n" und "\n" auch als "\r\n" 
interprtieren.

Nichts für ungut, es geht halt nicht!

Es wäre halt nett gewesen und würde ein Carriage Return auch ein 
Carriage Return sein und kein LineFeed/Carriage Return, wäre es auch 
einfach gewesen.
Ich dachte ich wäre nicht der erste dem auffällt das es keinen "\r" mehr 
gibt.

Sorry für Eure verschwendete Zeit, die Ihr mit meiner "blöden" Frage 
verbracht habt, ich dachte das wäre Standart.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Timebeast schrieb:
> ANSI-Escape Sequenz, so so, und das wird auch von allen Terminal
> Programmen unterstützt?

Die üblichen machen das.

Deswegen: Bray, hterm & Co. sind keine Terminalprogramme.

Terminalprogramme sind Programme, die ein Terminal nachahmen, i.d.R. 
DECs VT-100, das so verbreitet war, daß sein Befehlssatz eine ANSI-Norm 
wurde.

von Uwe B. (boerge) Benutzerseite


Lesenswert?

MoinMoin,

Timebeast schrieb:
> Die Terminal Programme interpretieren den "Standart" allerdings
> anscheinend anders in dem sie "\r" als "\r\n" und "\n" auch als "\r\n"
> interprtieren.
ich würde sogar soweit gehen, das manche Betriebssysteme das Zeilenende 
einfach umdefinieren und sich Anwendungsprogramme dem 
Betreibssystemstandard anpassen:

Windows --> cr/lf
Unix    --> lf
MacOS   --> cr

Gleiches Verhalten hat man ja auch, wenn man sich Textdateien, welche 
unter dem jeweiligen Betriebssystem erzeugt hat, anschaut.

Wie schon oben geschrieben, entweder man sucht sich die entsprechende 
Option des jeweiligen Terminalprogrammes heraus und ändert diese nach 
seinen Wünschen ab oder benutzt einen wirklichen Standard, wie z.B. 
ANSI-ESC-Sequenzen, wenn man wirklich auf der sicheren Seite sein 
möchte.

Grüße Uwe

PS.: was lernen wir eigentlich daraus --> allein nur UNIX zeigt die Welt 
"unverblümt" an ;-)

von Klaus D. (kolisson)


Lesenswert?

Uwe Berger schrieb:
> Wie schon oben geschrieben, entweder man sucht sich die entsprechende
> Option des jeweiligen Terminalprogrammes heraus und ändert diese nach
> seinen Wünschen ab oder benutzt einen wirklichen Standard, wie z.B.
> ANSI-ESC-Sequenzen, wenn man wirklich auf der sicheren Seite sein
> möchte.

Genau! So kommt es mir auch vor.
Was der TO genau will hat er ja noch nicht gesagt.
Möchte er ein Terminalfenster wie einen Grafikbildschirm ansteuern und 
für Wert 1 (zei2,spa4) angeben soll er VT100 nehmen.

Will er ein einfaches Frontent auf dem PC für Messwerte kann er auf VB 
oder sonstwas zurückgreifen und den uC abfragen um die Werte in eine 
Maske zu pressen.

Will er kein LF soll er es nicht senden.


Irgendwie merkwürdig diese Fragestellung


Gruss Klaus

von Gerhard (Gast)


Lesenswert?

na die Fragestellung ist doch inzwischen klar! Er will ein CR senden und 
im Terminalprogramm soll der Cursor nur an den Zeilenanfang springen und 
kein zusätzliches Line Feed machen.

Gerhard

von Jörg E. (jackfritt)


Lesenswert?

So mach ich das. Und das Putty nicht gut ist ist mir egal. Es frisst was 
Ich ihm gebe. Und wenns das nicht tut bastel ich halt drumherum. Oder 
willste dir noch die Arbeit machen ein Terminal Programm zu schreiben?
1
static const char Con_init[] PROGMEM = "\033[37;40m\033[2J\033[H\033[ ? 25 l"; //ANSI einschalten, Bildschirm löschen, s/w, Cursor unsichtbar
2
static const char Con_Home[] PROGMEM = "\033[2J\033[H"; // Console Home x=0 y=0

von Uwe B. (boerge) Benutzerseite


Lesenswert?

Timebeast schrieb:
> Jetzt schreibt er mir allerdings jeden Wert (es sind Strings) in eine
> neue Zeile und das macht die Sache komplett unleserlich.

Gerhard schrieb:
> na die Fragestellung ist doch inzwischen klar! Er will ein CR senden und
> im Terminalprogramm soll der Cursor nur an den Zeilenanfang springen und
> kein zusätzliches Line Feed machen.

...nein eben nicht, sonst würde ersteres Zitat nicht so ausfallen! Aus 
diesem Satz lese ich (und auch andere), dass der TO auf Basis von \b, 
\n, \r, \t usw. eine, in welcher Form auch immer, formatierte Ausgabe 
generieren will. Wenn dem so ist, ist er auf dem falschen Weg.

Vielleicht noch ein paar Links zum Thema, die dann passen würden:

http://www.mikrocontroller.net/articles/MCURSES

auf deren Basis ich dann mal einen Full-Screen-Editor (auch für MCs 
geeignet) geschrieben habe:

Beitrag "Re: MCURSES - Mini Curses Bibliothek für Mikrocontroller"

Grüße Uwe

von Soul E. (Gast)


Lesenswert?

Timebeast schrieb:
> Und wie ich oben schon schrieb halte ich mich ja an den Standart:
> "\r" = Carriage Return
> "\n" = new Line

> Die Terminal Programme interpretieren den "Standart" allerdings
> anscheinend anders in dem sie "\r" als "\r\n" und "\n" auch als "\r\n"
> interprtieren.

Welche tun das? Selbst das ganz billige Windows Hyperterminal 
interpretiert CR und LF separat und korrekt.
1
"Hello \rWorld" liefert 
2
"World "
3
4
"Hello \nWorld" liefert
5
"Hello 
6
       World"
7
8
"Hello \r\nWorld" liefert
9
"Hello "
10
"World"

Du kannst die meisten Terminalprogramme allerdings so einstellen, dass 
ein loses CR automatisch um ein LF ergänzt wird. Beim Windows 
Hyperterminal ist das "Beim Empfang Zeilenvorschub an Zeilenende 
anhängen".

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.