Wie kann ich Daten an eine serielle Schnittstelle senden und eine Antwort sehen?

37

Unter Linux möchte ich eine Befehlszeichenfolge (dh einige Daten) an eine serielle Schnittstelle senden (die Steuerzeichen enthält) und die Antwort abhören (die normalerweise auch Steuerzeichen enthält).

Wie kann ich das unter Linux so einfach wie möglich machen? Ein Beispiel wird geschätzt!

Alex
quelle
Sie sollten sich diese unix.stackexchange.com/a/116705/53092
Kiwy
Ich habe keine Überwachung installiert.
Alex
Nominierung für die Wiedereröffnung - es ist kein Duplikat, wie vorgeschlagen.
Peterph
einige Leute sind zu dumm, sie schlagen nur Fragen als dublicate vor. Lesen Sie zuerst die Fragen und beantworten Sie sie.
Denis

Antworten:

54

Alle Geräte unter Unix sind einer Gerätedatei zugeordnet, die seriellen Schnittstellen wären /dev/ttyS0 /dev/ttyS1....

Schauen Sie sich zunächst die Berechtigungen für diese Datei an. Nehmen wir an, Sie verwenden sie /dev/ttyS1.

ls -l /dev/ttyS1

Sie möchten einen Lese- / Schreibzugriff. Wenn es sich um ein freigegebenes System handelt, sollten Sie die Sicherheitsfolgen berücksichtigen, die sich aus dem Öffnen für alle ergeben.

chmod o+rw /dev/ttyS1

Eine sehr einfache rohe Methode, um in die Datei zu schreiben, würde den einfachen echoBefehl verwenden.

echo -ne '\033[2J' > /dev/ttyS1

und zu lesen

cat -v < /dev/ttyS1

Sie können in einem Terminal eine Katze laufen lassen und in einem zweiten ein Echo erzeugen.

Wenn alles Kauderwelsch ist, müssen die Bit-Einstellungen möglicherweise vorgenommen werden, bevor Sie mit dem Senden beginnen. sttywird das machen. !! HINWEIS stty verwendet stdin als Standarddateideskriptor.

Äquivalente Befehle.

stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1

Dies könnte für Sie ausreichen, um etwas zu schreiben und zu protokollieren? Nicht sicher, was Sie erreichen wollen.

Für eine interaktivere, erinnert sich Ihre Standardeinstellung wäre, es zu verwenden minicom, ist nur ein Programm, das alles tut, was ich bisher erwähnt habe. (Ähnlich wie bei Hyperterminal unter Windows sind Sie möglicherweise vertraut).

Eine Zwischenlösung wäre ein Terminalprogramm, wie screenes auf einem seriellen Gerät funktioniert.

screen /dev/ttyS1

man screen man minicom man stty für mehr Informationen

X Tian
quelle
Ich bekomme überhaupt keine Ausgabe. Hast du irgendwelche Ideen?
Goldname
Möglicherweise können Sie den Hardware-Datenfluss steuern, indem Sie entweder mit dem Befehl atty ausschalten oder das serielle Kabel überbrücken und nach dem Nullmodemkabel suchen.
X Tian
1
# stty -speed 38400 -f /dev/ttyUSB1kehrt zurückstty: invalid argument '-speed'
Pro Backup
1
Bei stty ist es -F (Großbuchstabe F), um das Gerät einzustellen. Auch dein Geschwindigkeitsparameter ist falsch. Sie können speed verwenden, um die Baudrate des Ports zu ermitteln, oder ispeed oder ospeed (ohne Minuszeichen), um die Eingabe- und Ausgabegeschwindigkeit festzulegen, oder einfach eine Zahl, um die Eingabe- und Ausgabegeschwindigkeit festzulegen: stty 19200 -F / dev / ttyS ....
Paulus
Erstaunlicherweise hat das noch niemand bemerkt, danke @Pro Backup Ich habe das Beispiel korrigiert.
X Tian
11

Sie müssen lediglich zwei Terminals öffnen. Im ersten Terminal hast du catalles vom Gerät, z

cat /dev/ttyS0

Im anderen Terminal können Sie beliebige hexadezimale Zeichen und Text an das Terminal senden, z. B. wie folgt:

echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0

Der echo -eBefehl ermöglicht die Interpretation von Backslash-Escapes.

Man muss natürlich sicherstellen, dass (i) die seriellen Einstellungen (Geschwindigkeit, Wortlänge, Flusskontrolle usw.) korrekt sind und (ii) das serielle Gerät (am anderen Ende) nicht blockiert.

Alex
quelle
Sie haben diese 10 Minuten beantwortet, nachdem ich meine Antwort oben geschrieben habe, und Sie haben überhaupt keine weiteren Informationen hinzugefügt!
X Tian
Oh sorry, ich habe deine Antwort nicht vollständig gelesen. Ich habe gesehen, dass meine Antwort in Ihrer enthalten ist, daher werde ich Ihre Antwort als die richtige akzeptieren, wie Sie genau das beschrieben haben, was ich beschrieben habe.
Alex
Ich weiß nicht viel über COM-Ports. Könnten Sie bitte erklären, was "das serielle Gerät (am anderen Ende) nicht blockiert" bedeutet? Probleme mit der Firewall?
Sopalajo de Arrierez,
9

Programme, die mit seriellen Geräten kommunizieren:

picocom
minicom
socat

oder von der Shell aus können Sie tun:

stty -speed 19200 < /dev/ttyS0 # sets the speed of the port
exec 99<>/dev/ttyS0 (or /dev/ttyUSB0...etc)
printf "AT\r" >&99
read answer <&99  # this reads just a CR
read answer <&99  # this reads the answer OK
exec 99>&-
Zibri
quelle
deins ist eine großartige Antwort, die mich über bidirektionale Dateideskriptoren unterrichtet hat. Sind Sie jedoch sicher, dass die letzte Zeilensyntax zum Schließen des Deskriptors richtig ist? Ich bekomme einen Syntaxfehler. Ich denke, entweder exec 99<&-oder exec 99>&-sollte verwendet werden. Oder vielleicht beides?
Yankee
1
Tippfehler .. Sie haben Recht
Zibri
7

Dies könnte ein besserer Ansatz sein:

stty -F /dev/ttyUSB0 115200 raw -echo   #CONFIGURE SERIAL PORT
exec 3</dev/ttyUSB0                     #REDIRECT SERIAL OUTPUT TO FD 3
  cat <&3 > /tmp/ttyDump.dat &          #REDIRECT SERIAL OUTPUT TO FILE
  PID=$!                                #SAVE PID TO KILL CAT
    echo "R" > /dev/ttyUSB0             #SEND COMMAND STRING TO SERIAL PORT
    sleep 0.2s                          #WAIT FOR RESPONSE
  kill $PID                             #KILL CAT PROCESS
  wait $PID 2>/dev/null                 #SUPRESS "Terminated" output

exec 3<&-                               #FREE FD 3
cat /tmp/ttyDump.dat                    #DUMP CAPTURED DATA
Leonardo Mendoza
quelle
Das ist sehr gut, weil es den Prozess automatisiert! Die einzige Änderung, die ich vornehmen würde, die völlig optional ist, besteht darin, zu bestätigen, dass der empfangene Inhalt der gleiche ist wie der gesendete.
HiDefLoLife
4

Sie können auf einem Gerät gleichzeitig lesen und schreiben:

cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411

Ihre Nachricht wird an die zweite catvon gesendet stdin, und die erste catleitet die Antwort an weiter stdoutund verwandelt Ihr Terminal in einen Chatroom.

Zum Schluss dann nochmal ctrl-claufen .fgctrl-c

diachedelisch
quelle