web-dev-qa-db-de.com

Schreiben an die serielle Schnittstelle von der Linux-Befehlszeile

Unter Windows kann ich mit einem Gerät mit serieller Schnittstelle mithilfe der folgenden Befehle kommunizieren:

mode com1: baud=9600 data=8 parity=n stop=1
copy con com1
alt+18alt+2ctrl+z

Gerät startet den angeforderten Vorgang.

Wenn ich versuche, dieselbe Operation von einer eigenständigen Debian-Box oder von einer Debian-Virtualbox-Instanz derselben Windows-Maschine aus durchzuführen, hatte ich bisher kein Glück.

Hier sind äquivalente Linux-Befehle (zumindest glaube ich das)

stty -F /dev/ttyS0 speed 9600 cs8 -cstopb -parenb
echo '\x12\x02' > /dev/ttyS0

Nichts passiert.

Kann mich bitte jemand in die richtige Richtung leiten?

42
erin c
echo '\x12\x02'

wird nicht interpretiert und schreibt buchstäblich den String \x12\x02 (und hängen Sie eine neue Zeile an) an die angegebene serielle Schnittstelle an. Verwenden Sie stattdessen

echo -n ^R^B

die Sie durch Eingabe in der Befehlszeile erstellen können CtrlVCtrlR und CtrlVCtrlB. Oder es ist einfacher, einen Editor zum Eingeben in eine Skriptdatei zu verwenden.

Der Befehl stty sollte funktionieren, es sei denn, ein anderes Programm stört. Ein häufiger Täter ist gpsd, der nach angeschlossenen GPS-Geräten sucht.

17
wallyk

Wenn Sie Hex-Codes verwenden möchten, sollten Sie die Option -e Hinzufügen, um die Interpretation von umgekehrten Schrägstrichen durch Echo zu ermöglichen (das Ergebnis ist jedoch dasselbe wie bei echoCtrlRCtrlB). Und wie Wallyk sagte, möchten Sie wahrscheinlich -n Hinzufügen, um die Ausgabe einer neuen Zeile zu verhindern:

echo -en '\x12\x02' > /dev/ttyS0

Stellen Sie außerdem sicher, dass /dev/ttyS0 Der gewünschte Port ist.

33

BILDSCHIRM:

[~ # ~] note [~ # ~]: bildschirm kann meines wissens kein hex senden. Verwenden Sie dazu echo oder printf

Ich habe die Vorschläge in diesem Beitrag verwendet, um auf eine serielle Schnittstelle zu schreiben, und dann die Informationen von einer anderen Beitrag verwendet, um mit gemischten Ergebnissen von der Schnittstelle zu lesen. Ich fand, dass die Verwendung von screen eine "einfachere" Lösung ist, da eine Terminalsitzung direkt mit diesem Port geöffnet wird. (Ich füge es einfacher in Anführungszeichen ein, weil der Bildschirm eine wirklich seltsame Oberfläche hat, IMO. Um dies herauszufinden, sind einige weitere Lektüren erforderlich.)

Sie können diesen Befehl ausgeben, um eine Bildschirmsitzung zu öffnen. Anschließend wird alles, was Sie eingeben, an den Port gesendet, und die Rückgabewerte werden darunter gedruckt:

screen /dev/ttyS0 19200,cs8

(Passen Sie die obigen Angaben an Ihre Anforderungen an Geschwindigkeit, Parität, Stoppbits usw. an.) Ich stelle fest, dass screen nicht die "Linux-Befehlszeile" ist, nach der der Beitrag speziell fragt, aber ich denke, es ist im selben Sinne. Außerdem müssen Sie nicht jedes Mal Echo und Anführungszeichen eingeben.

ECHO:

Folgen Sie der Antwort des Prätorianers. Dies funktionierte jedoch nicht für mich, bis ich auch den Befehl cat (cat < /dev/ttyS0) while Ich habe den Echo-Befehl gesendet.

PRINTF:

Ich habe festgestellt, dass man auch den '% x'-Befehl von printf verwenden kann:

c="\x"$(printf '%x' 0x12)
printf $c >> $SERIAL_COMM_PORT

Starten Sie für printf erneut cat < /dev/ttyS0 vor dem Senden des Befehls.

7
MrUser