Blog der Heimetli Software AG

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.