Screen als Serial-Terminal

Manche Dinge sind so einfach, dass man keine Ahnung hat, wie einfach sie sein können. Vorhin bin ich über eine tolle kleine Unix-Anwendung gestolpert, die einem die Nutzung von Arduino massiv vereinfachen kann: "screen"

Bisher habe ich jedes Mal, wenn ich mit meinem Arduino kommunizieren wollte, die Arduino-IDE geöffnet und dort den Serial-Terminal verwendet. Das ist zum einen umständlich und zum anderen werden Nutzer später wahrscheinlich nicht unbedingt die Arduino-IDE bei sich installiert haben.

Screen aufrufen

Screen aufrufen

Klar gibt es Tools, die man sich irgendwo herunterladen kann (unter Windows ist zum Beispiel PuTTY eine häufige Wahl), aber ich habe es gern, wenn ich auch Onboard-Lösungen kenne. Und "screen" auf unixoiden System ist genau das. Um zu wissen, mit welchen Geräten man sich überhaupt verbinden kann, sollte man sich erst angucken, welche TTY-Devices es gibt:

1
ls /dev/tty.*

Hier sticht der Arduino als einziges USB-Device deutlich hervor. Der Aufruf von "screen" ist dann ziemlich einfach. Man benötigt den Gerätenamen und dazu (bei mir war es optional) die Baudrate (die Zahl, die man z.B. bei "Serial.begin()" beim Arduino angibt).

1
screen /dev/tty.usbmodem1d11 9600

Anschließend wird einem die serielle Ausgabe als normale Konsolendarstellung bereitgestellt. Bei meinem derzeitigen Arduino-Projekt, das im Moment über einfache serielle Ein- und Ausgaben funktioniert, habe ich dadurch eine Art normale Terminalanwendung - nur, dass die Logik eben auf einer separaten Hardware läuft.

Screen Darstellung

Screen Darstellung

Das einzige, was ich bisher noch nicht herausgefunden habe, ist, wie ich die Verbindung trennen kann, sodass ich sie erneut öffnen kann, ohne vorher den Stecker des Arduinos herausziehen zu müssen. Bisher ist das Gerät da ein bisschen zickig. ^_^
Update:
Ich habe nun endlich des Rätsels Lösung gefunden! Mit der Tastenkombination "Ctrl+A D" kann man ja Screen von der geöffneten seriellen Schnittstelle trennen. So ist zumindest der Plan. Wie ich jedoch feststellen musste, hielt Screen die Verbindung weiterhin geöffnet. Getestet habe ich das mit:

1
lsof /dev/tty.*

Dabei herausgekommen ist folgendes:

1
2
3
WeizenBook:~ kenny$ lsof /dev/tty.*
COMMAND   PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
screen  13242 kenny    5u   CHR  18,34     0t52 1285 /dev/tty.usbmodem1d11

Gelöst habe ich das dadurch, indem ich den entsprechenden Prozess einfach abgeschossen habe:

1
kill -9 13242

Und siehe da: Plötzlich klappt auch eine erneute Verbindung mit dem Arduino. Super. Aber doof. Extra händisch den Prozess killen zu müssen. Ob das wirklich so gewollt ist?

Update:
Wie man den hilfreichen Kommentaren von Oliver entnehmen kann, gibt es mehrere Möglichkeiten, die mit "Ctrl+A D" beendete (= "detachte") Session wieder zu bekommen. Die eine Möglichkeit ist, die letzte Session fortzusetzen (= "reattachen"):

1
screen -r

Die andere Möglichkeit ist, sich mit einem Befehl sämtliche verfügbaren Sessions anzeigen zu lassen. Die Sessionnamen sind in der Regel mit Punkten getrennte Bezeichner in der Form "[PID].TTY.[HOSTNAME]":

1
screen -ls

Mit folgendem Befehl kann man sich nun wieder zu dieser Session verbinden:

1
screen -x [SESSIONNAME]

Update:
Ich habe eine interessante Seite gefunden, auf der sämtliche Tastenkombinationen von Screen beschrieben sind. Darunter auch die Kombination "Ctrl+A K", um die Session zu töten (= "killen"). Die werde ich heute Abend mal ausprobieren. :)
Serielle Grüße, Kenny