Ein Script für minicom
Normalerweise schreibe ich Programme für die serielle Schnittstelle in C, aber es ist oft praktisch wenn man mit einem einfachen Script prüfen kann was das Gerät an der Schnittstelle wirklich macht.
Bei anderen Terminal-Programmen ist es nicht aufwendig, ein Script zu schreiben, aber bei Minicom hat es mich viel Zeit gekostet.
Das lag vor allem daran, dass die Scripts von minicom schlecht dokumentiert sind. Genau genommen, sind sie gar nicht dokumentiert, weil minicom ein externes Programm aufruft das die Scripts ausführt: runscript.
runscript hat zwar eine man-Page, aber die ist nicht so einfach zu interpretieren. Zudem muss man sich zumindest bei einigen Befehlen sehr genau an die Beispiele halten, sonst funktioniert das Script nicht.
Das Beispielscript
Dieses Script erwartet ein GSM-Modul an der seriellen Schnittstelle. Es schickt ein Reset ans Modul, und liest dann die Identifikation, den Hersteller und die Software-Version aus.
send "ATZ" expect { "OK" } print "" send "AT+CGMI" expect { "OK" } print "" send "AT+CGMM" expect { "OK" } print "" send "AT+CGMR" expect { "OK" } print "" ! killall -9 minicom
send dürfte selbsterklärend sein, bis auf die Tatsache dass nach dem Text auch ein Carriage-Return ('\r') geschickt wird.
expect wartet auf den angegebenen String und lässt das Script dann weiterlaufen. Dieser Befehl muss genau wie hier angegeben geschrieben werden, sonst gibt es Aerger...
Falls der gesuchte Text nicht auftaucht, bleibt das Script nicht etwa endlos hängen. Nach einem einstellbaren Timeout geht es weiter.
print habe ich nur benutzt um eine neue Zeile zu bekommen. Es hat also eine rein kosmetische Funktion.
Recht speziell ist die letzte Zeile: sie beendet minicom! Es gibt zwar eine exit-Anweisung, aber die beendet nur runscript. Diese Zeile hier führt eine neue Shell aus, in der minicom schlicht gekillt wird. Ungewöhnlich, aber so läuft es.
Das Space hinter dem Ausrufezeichen ist übrigens unbedingt nötig, sonst gibt es bloss eine Fehlermeldung.
Das Script ausführen
Eine Zeile reicht, um das Script mit minicom auszuführen und die Ausgaben in ein Logfile zu schreiben:
minicom -o -D /dev/ttyUSB0 -S minicom.script -C minicom.log
Die Option -o sorgt dafür, dass minicom keine Initialisierung macht. -D bestimmt, welches Device verwendet wird. Hier ist es ein USB-Seriell Adapter.
Das Logfile
Alles was auf der Schnittstelle läuft, wird in minicom.log mitgeschrieben:
ATZ OK AT+CGMI Telit OK AT+CGMM GC864-QUAD-V2 OK AT+CGMR 10.00.058 OK
minicom und cron
Wenn es einen Weg gibt, minicom von der crontab aus zu starten, dann habe ich den bisher nicht gefunden.
Ohne weitere Vorkehrungen beendet sich minicom sofort, und meldet, dass es keine Möglichkeit gefunden hat um den Cursor zu setzen.