Résultats inattendus testant le bouclage série en utilisant l'écho et le chat

17

J'ai donc un port série RS232 standard qui est rebouclé sur lui-même en passant simplement un fil de Tx à Rx. Je teste le bouclage en exécutant echoet catdans deux terminaux distincts:

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

Mon problème est avec la sortie. Je m'attendrais à voir un "salut" revenir sur le terminal exécutant cat mais à la place j'obtiens ceci:

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

... et ainsi de suite jusqu'à I ctrl+ c cat.

Après avoir interrompu cat, si je le lance à nouveau, il ne sortira pas "hi" jusqu'à ce que je lance l'écho une deuxième fois.

Est-ce normal? Une idée pourquoi je vois ce comportement?

Edit : Par newline, je veux dire ASCII 0x0A. Il n'y a pas de retour chariot dans cette sortie.

Kristina
la source
Cela pourrait-il être dû au fait que deux processus ouvrent le même appareil? Que se passe-t-il si vous exécutez tip /dev/ttyS1( ~.pour quitter) et essayez de taper des données là-bas? Il doit être affiché dans votre terminal lorsque le fil est connecté, car il reçoit ce qu'il a transmis.
mrb
3
Obtenez-vous vraiment des retours à la ligne ou une paire retour-chariot / retour à la ligne? La distinction est importante au niveau où vous travaillez. Essayez "cat / dev / ttyS1> somefile" puis faites "od -x somefile" pour voir exactement quels octets sortent du fichier du périphérique TTY. Faites également un "stty -F / dev / ttyS1 -a". Lisez la page de manuel de "stty" et regardez ce que la sortie de stty vous dit, pour chaque petit paramètre. Les communications série RS232 sont délicates.
Bruce Ediger

Réponses:

21

Grâce au deuxième commentaire de Bruce, j'ai pu résoudre le problème par moi-même.

Après l'exécution stty -a -F /dev/ttyS1, j'ai trouvé 3 options pour contribuer au problème: "echo", "onlcr" et "icrnl".

Puisque ce port série est rebouclé sur lui-même, voici ce qui s'est passé après l'exécution echo "hi" > /dev/ttyS1:

  1. La echocommande ajoute une nouvelle ligne à la fin du message par défaut, donc "hi" + LF est envoyé à / dev / ttyS1
  2. Parce que "onlcr" a été défini, le périphérique série a converti le LF en CRLF de sorte que le message physique envoyé sur la ligne Tx était "hi" + CRLF
  3. Parce que "icrnl" a été défini, le message physique reçu sur la ligne Rx a converti le CR en LF. Le message émis par 'cat' était donc "hi" + LFLF.
  4. Parce que "echo" a été défini, le message reçu sur le Rx ("hi" + LFLF), a ensuite été renvoyé sur la ligne Tx.
  5. En raison de onlcr, "hi" + LFLF est devenu "hi" + CRLFCRLF.
  6. En raison de l'icrnl, "hi" + CRLFCRLF est devenu "hi" + LFLFLFLF
  7. En raison de l'écho, "hi" + LFLFLFLF a ensuite été envoyé le Tx

Etc...

Afin de résoudre ce problème, j'ai exécuté la commande suivante:

stty -F /dev/ttyS1 -echo -onlcr

La désactivation de "echo" empêche une boucle infinie de messages et la désactivation de "onlcr" empêche le périphérique série de convertir LF en CRLF en sortie. Reçoit maintenant catun "salut" (avec une seule nouvelle ligne!) Pour chaque fois que je cours echo.

CR = retour chariot (ASCII 0x0D); LF = saut de ligne ou nouvelle ligne (ASCII 0x0A)

Kristina
la source
-icrnla fait l'affaire pour moi.
tcpaiva
3

J'ai également eu un problème similaire avec la concaténation de fichiers dans un tty série pour les tests. En plus de la réponse acceptée:

Si vous testez la sortie série en faisant quelque chose comme:, cat somefile.txt > /dev/ttyS0elle contiendra une bonne quantité de données d'octets inattendues si vous testez des valeurs d'octets exactes.

En sttyfaisant un simple, stty raw -F /dev/ttyS0cela empêchera le terminal d'insérer / remplacer des caractères (par exemple [...] 0x0A [...]-> [...] 0x0D 0x0A [...]). L' rawindicateur modifie les modes du terminal afin qu'aucun traitement d'entrée et de sortie ne soit effectué.

j'ai besoin de dormir
la source
1
Hmm ... ne ressemble pas à stty rawdésactiver l'écho par défaut. Vous devrez peut-être le faire stty raw -echo.
BMiner