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.