Unerwartete Ergebnisse beim Testen des seriellen Loopbacks mit Echo und Cat

Unerwartete Ergebnisse beim Testen des seriellen Loopbacks mit Echo und Cat

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 echound catin 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/ttyS1habe 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:

  1. Der echoBefehl hängt standardmäßig eine neue Zeile an das Ende der Nachricht an, sodass "hi" + LF an /dev/ttyS1 gesendet wird.
  2. 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.
  3. 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.
  4. Da „Echo“ gesetzt war, wurde die auf dem Rx empfangene Nachricht („hi“ + LFLF) anschließend über die Tx-Leitung zurückgesendet.
  5. Aufgrund von onlcr wurde aus „hi“ + LFLF „hi“ + CRLFCRLF.
  6. Aufgrund von icrnl wurde aus „hi“ + CRLFCRLF „hi“ + LFLFLFLF
  7. 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 catbei 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/ttyS0wird sie eine große Menge unerwarteter Byte-Daten enthalten, wenn Sie auf exakte Byte-Werte testen.

Mit sttyeinem einfachen Befehl stty raw -F /dev/ttyS0wird das Einfügen/Ersetzen von Zeichen durch das Terminal unterbunden (z. B. [...] 0x0A [...]-> [...] 0x0D 0x0A [...]). Das rawFlag ändert die Modi des Terminals, sodass keine Eingabe- und Ausgabeverarbeitung durchgeführt wird.

verwandte Informationen