Unerwartete Ergebnisse beim Testen eines seriellen Loopbacks mit Echo und Cat

16

Ich habe also einen seriellen RS232-Standardanschluss, der durch einfaches Verlegen eines Kabels von Tx zu Rx zu sich selbst zurückgeschleift wird. Ich teste Loopback, indem ich echound catin zwei getrennten Terminals ausführe:

cat /dev/ttyS1
echo "hi" > /dev/ttyS1

Mein Problem ist mit der Ausgabe. Ich würde erwarten, dass ein "hi" auf dem Terminal zurückkommt, auf dem cat läuft, aber stattdessen bekomme ich Folgendes:

hi
[2 newlines]
hi
[4 newlines]
hi
[8 newlines]
hi
[16 newlines]
hi
[32 newlines]
hi

... und so weiter bis ich ctrl+ c cat.

Nach dem Unterbrechen von cat wird es, wenn ich es erneut starte, keine "Hi" s ausgeben, bis ich das Echo ein zweites Mal starte.

Ist das normal? Irgendeine Idee, warum ich dieses Verhalten sehe?

Edit : Mit newline meine ich ASCII 0x0A. In dieser Ausgabe gibt es keine Wagenrückläufe.

Kristina
quelle
Könnte es sein, dass zwei Prozesse dasselbe Gerät öffnen? Was ist, wenn Sie ausführen tip /dev/ttyS1(um ~.zu beenden) und versuchen, Daten dort einzugeben? Es sollte in Ihrem Terminal angezeigt werden, wenn das Kabel angeschlossen ist, da es empfängt, was es gesendet hat.
Mrb
3
Erhalten Sie wirklich Zeilenumbrüche oder ein Zeilenumbruchs / Zeilenumbruchs-Paar? Die Unterscheidung ist auf der Ebene wichtig, auf der Sie arbeiten. Versuchen Sie "cat / dev / ttyS1> somefile" und dann "od -x somefile", um genau zu sehen, welche Bytes aus der TTY-Gerätedatei kommen. Führen Sie auch "stty -F / dev / ttyS1 -a" aus. Lesen Sie die Manpage für "stty" und sehen Sie sich für jede kleine Einstellung an, was die Ausgabe von stty Ihnen sagt. Serielle RS232-Kommunikation ist schwierig.
Bruce Ediger

Antworten:

20

Dank des zweiten Kommentars von Bruce konnte ich das Problem selbst herausfinden.

Nach dem Ausführen stty -a -F /dev/ttyS1gab es drei Optionen, die ich gefunden habe, um zum Problem beizutragen: "echo", "onlcr" und "icrnl".

Da diese serielle Schnittstelle zu sich selbst zurückgeschleift ist, ist nach dem Ausführen Folgendes passiert echo "hi" > /dev/ttyS1:

  1. Der echoBefehl fügt standardmäßig eine neue Zeile an das Ende der Nachricht an, sodass "hi" + LF an / dev / ttyS1 gesendet wird
  2. Da "onlcr" festgelegt wurde, hat das serielle Gerät die LF in CRLF konvertiert, sodass die über die Tx-Leitung gesendete physische Nachricht "hi" + CRLF lautete
  3. Da "icrnl" festgelegt wurde, hat die auf der Rx-Leitung empfangene physische Nachricht die CR in LF konvertiert. Die von 'cat' ausgegebene Nachricht war also "hi" + LFLF.
  4. Da "Echo" eingestellt war, wurde die auf dem Rx empfangene Nachricht ("Hi" + LFLF) auf der Tx-Leitung zurückgesendet.
  5. Aus "hi" + LFLF wurde "hi" + CRLFCRLF.
  6. Aufgrund von icrnl wurde "hi" + CRLFCRLF zu "hi" + LFLFLFLF
  7. Wegen Echo wurde dann "hi" + LFLFLFLF der Tx rausgeschickt

Und so weiter...

Um dieses Problem zu beheben, habe ich den folgenden Befehl ausgeführt:

stty -F /dev/ttyS1 -echo -onlcr

Durch Deaktivieren von "echo" wird eine Endlosschleife von Nachrichten verhindert, und durch Deaktivieren von "onlcr" wird verhindert, dass das serielle Gerät bei der Ausgabe LF in CRLF konvertiert. catErhält jetzt ein "Hallo" (mit einem einzelnen Zeilenumbruch!) Für jedes Mal, wenn ich renne echo.

CR = Wagenrücklauf (ASCII 0x0D); LF = Zeilenvorschub oder Newline (ASCII 0x0A)

Kristina
quelle
-icrnlhat den Trick für mich getan.
tcpaiva
3

Ich hatte ein ähnliches Problem mit der Verkettung von Dateien zu einer Seriennummer zum Testen. Zusätzlich zur akzeptierten Antwort:

Wenn Sie die serielle Ausgabe testen, indem Sie Folgendes ausführen: cat somefile.txt > /dev/ttyS0Wenn Sie auf exakte Bytewerte testen, weist sie eine große Menge unerwarteter Bytedaten auf.

Mit sttyeinem einfachen stty raw -F /dev/ttyS0Befehl wird das Terminal daran gehindert , Zeichen einzufügen / zu ersetzen (zB [...] 0x0A [...]-> [...] 0x0D 0x0A [...]). Das rawFlag ändert die Modi des Terminals, sodass keine Eingabe- und Ausgabeverarbeitung durchgeführt wird.

ich muss schlafen
quelle
1
Hmm ... sieht nicht so aus, als würde stty rawdas Echo standardmäßig deaktiviert. Möglicherweise müssen Sie tun stty raw -echo.
BMiner