Ein serielles Port mit bash auslesen
Die Frage tauchte in der letzten Zeit gleich zweimal auf. Zuerst glaubte ich dass das ganz einfach zu lösen ist:
echo -e "AT\r" > /dev/ttyUSB0 cat /dev/ttyUSB0
Wahrscheinlich wird das Kommando vom Modul auch ausgeführt, aber die Antwort bekommt man so nicht zurück.
Die Lösung
Eine while-Schleife mit Redirection löst das Problem. Weil mein Modul die verlangten Befehle nicht kennt, werden im folgenden Code keine wirklich sinnvollen Kommandos abgesetzt.
#!/bin/bash PORT="/dev/ttyUSB0" CMD="AT\r" while true do echo -e $CMD > $PORT CMD="AT+CPIN?\r" while read -t 5 key value do if [[ $key == "+CPIN:" ]] then echo $value fi done done < $PORT
Der erste Befehl dient im Zielsystem zur Initialisierung, er wird nur einmal abgesetzt. Deshalb wird er schon in der ersten Iteration überschrieben.
Der zweite Befehl liefert eine mehrzeilige Antwort. Die innere while-Schleife und das Timeout beim read sorgen dafür dass alle Zeilen gelesen werden. Dank dem Timeout bekommen sowohl das Modul als auch das Script eine Pause zwischen den Abfragen.
read teilt die Eingabe in zwei Teile auf, was in diesem Fall sehr nützlich ist. Die Kennung steht im ersten Teil, der zugehörige Wert im zweiten. Das if sorgt dafür dass nur die interessanten Teile der Antwort ausgegeben werden.