Forum: PC Hard- und Software Leseende auf einer tty veranlassen


von Lukas K. (carrotindustries)


Lesenswert?

Hallo zusammen,
ein µC sendet über die serielle Schnittstelle (ttyS0) Daten an meinen 
Computer. Diese werden mittels
1
cat /dev/ttyS0 > datei
umgeleitet. Nun muss ich abschätzen, wann die Übertragung zu Ende ist 
und dann ^C drücken. Wie kann ich dem Terminal sagen, dass es das Lesen 
beenden soll? Ein senden von 0x03 (^C) und 0x04 (^D) brachte schonmal 
nichts. Habt ihr sonst eine Idee, wich ich das Terminal dazu überzeugen 
kann die tty zu schließen?

Mfg Lukas

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nun, was ist "das Terminal" und was steht in dessen Dokumentation?

Schon mal ^Z ausprobiert?

von Andreas F. (aferber)


Lesenswert?

Sende mal zwei ^D direkt hintereinander. Wenn das tty-Device im 
Canonical-Mode ist ("stty -F /dev/ttyS0 -a" enthält "icanon" ohne ein 
"-" davor, ansonsten mit "stty -F /dev/ttyS0 sane" die 
Terminal-Einstellungen zurücksetzen), dann sollte das zu einem EOF und 
Beendigung des cat führen.

Der Hintergrund ist der, dass das EOF-Zeichen (^D) eigentlich nicht 
wirklich EOF bedeutet. Stattdessen wird der aktuelle Zeilenpuffer des 
Terminals an die lesende Anwendung gesendet. Enthält der Puffer keine 
Zeichen mehr (was direkt nach einem Newline oder eben einem EOF-Zeichen 
der Fall ist), dann werden exakt 0 Zeichen an die Anwendung geliefert, 
was dann eben EOF signalisiert.

Beobachten kannst du das auch, wenn du einfach so ein "cat >/dev/null" 
machst, also mit deinem lokalen Terminal (z.B. xterm oder so). Drückst 
du ^D, bevor du irgendetwas anderes eingegeben hast, wird das cat sofort 
beendet. Gibst du aber zunächst ein paar Zeichen ein, ohne Enter zu 
drücken, dann braucht es zwei ^D, um das cat zu beenden.

Das erste ^D taucht dabei übrigens trotzdem nicht im Datenstrom auf, du 
musst das also auch nicht aus dem generierten Output entfernen.

Andreas

von Lukas K. (carrotindustries)


Lesenswert?

Rufus t. Firefly schrieb:
> Nun, was ist "das Terminal" und was steht in dessen Dokumentation?
Der Terminalemulator meiner Desktopumgebung, keine Ahnung was für ein 
Terminal (VT100, etc) der emuliert.
> Schon mal ^Z ausprobiert?
geht nicht

Andreas Ferber schrieb:
> stty -F /dev/ttyS0 sane
Treffer, geht auch mit einem ^D; danke für den ausführlichen Beitrag

von Andreas F. (aferber)


Lesenswert?

Luk4s K. schrieb:
> geht auch mit einem ^D

Dann schliessen deine Daten mit einem Newline ab. Würden sie das nicht 
tun, wäre das zweite ^D nötig.

Andreas

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.