Leseende auf einer tty veranlassen

OP #1898430
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
#1898462
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren