
Ich habe also einen standardmäßigen seriellen RS232-Port, der durch einfaches Verlegen eines Kabels von Tx zu Rx auf sich selbst zurückgeschleift wird. Ich teste die Rückschleife, indem ich echo
und cat
in zwei separaten Terminals laufen lasse:
cat /dev/ttyS1
echo "hi" > /dev/ttyS1
Mein Problem ist die Ausgabe. Ich würde erwarten, dass auf dem Terminal, auf dem cat ausgeführt wird, ein „hi“ zurückkommt, aber stattdessen erhalte ich Folgendes:
hi
[2 newlines]
hi
[4 newlines]
hi
[8 newlines]
hi
[16 newlines]
hi
[32 newlines]
hi
... und so weiter, bis I ctrl+ c cat
.
Wenn ich cat nach der Unterbrechung erneut ausführe, gibt es keine „hi“s aus, bis ich echo ein zweites Mal ausführe.
Ist das normal? Irgendeine Idee, warum dieses Verhalten auftritt?
Bearbeiten: Mit Zeilenumbruch meine ich ASCII 0x0A
. In dieser Ausgabe gibt es keine Wagenrückläufe.
Antwort1
Dank des zweiten Kommentars von Bruce konnte ich das Problem selbst herausfinden.
Nach dem Ausführen stty -a -F /dev/ttyS1
habe ich drei Optionen gefunden, die zum Problem beitragen: „echo“, „onlcr“ und „icrnl“.
Da dieser serielle Port auf sich selbst zurückgeschleift ist, ist nach dem Ausführen Folgendes passiert echo "hi" > /dev/ttyS1
:
- Der
echo
Befehl hängt standardmäßig eine neue Zeile an das Ende der Nachricht an, sodass "hi" + LF an /dev/ttyS1 gesendet wird. - Da "onlcr" gesetzt war, konvertierte das serielle Gerät das LF in CRLF, sodass die über die Tx-Leitung gesendete physische Nachricht "hi" + CRLF war.
- Da „icrnl“ gesetzt war, konvertierte die auf der Rx-Leitung empfangene physische Nachricht den CR in LF. Die von „cat“ ausgegebene Nachricht war also „hi“ + LFLF.
- Da „Echo“ gesetzt war, wurde die auf dem Rx empfangene Nachricht („hi“ + LFLF) anschließend über die Tx-Leitung zurückgesendet.
- Aufgrund von onlcr wurde aus „hi“ + LFLF „hi“ + CRLFCRLF.
- Aufgrund von icrnl wurde aus „hi“ + CRLFCRLF „hi“ + LFLFLFLF
- Wegen Echo wurde dann "hi" + LFLFLFLF aus dem Tx gesendet
Und so weiter...
Um dieses Problem zu beheben, habe ich den folgenden Befehl ausgeführt:
stty -F /dev/ttyS1 -echo -onlcr
Das Deaktivieren von „echo“ verhindert eine Endlosschleife von Nachrichten und das Deaktivieren von „onlcr“ verhindert, dass das serielle Gerät bei der Ausgabe LF in CRLF umwandelt. Jetzt erhalte ich cat
bei jedem Ausführen ein „hi“ (mit einer einzelnen neuen Zeile!)echo
CR = Wagenrücklauf (ASCII 0x0D); LF = Zeilenvorschub oder neue Zeile (ASCII 0x0A)
Antwort2
Ich hatte auch ein ähnliches Problem mit dem Verketten von Dateien in einem seriellen TTY zum Testen. Zusätzlich zur akzeptierten Antwort:
Wenn Sie die serielle Ausgabe mit etwas wie dem Folgenden testen: cat somefile.txt > /dev/ttyS0
wird sie eine große Menge unerwarteter Byte-Daten enthalten, wenn Sie auf exakte Byte-Werte testen.
Mit stty
einem einfachen Befehl stty raw -F /dev/ttyS0
wird das Einfügen/Ersetzen von Zeichen durch das Terminal unterbunden (z. B. [...] 0x0A [...]
-> [...] 0x0D 0x0A [...]
). Das raw
Flag ändert die Modi des Terminals, sodass keine Eingabe- und Ausgabeverarbeitung durchgeführt wird.