Resultados inesperados al probar el loopback en serie usando echo y cat

Resultados inesperados al probar el loopback en serie usando echo y cat

Entonces tengo un puerto serie RS232 estándar que se conecta a sí mismo simplemente pasando un cable de Tx a Rx. Estoy probando el loopback ejecutando echoy caten dos terminales separadas:

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

Mi problema es con la salida. Esperaría ver un "hola" en la terminal ejecutando cat, pero en su lugar aparece esto:

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

...y así sucesivamente hasta que ctrl+ c cat.

Después de interrumpir cat, si lo ejecuto nuevamente, no emitirá "hola" hasta que ejecute echo por segunda vez.

¿Esto es normal? ¿Alguna idea de por qué veo este comportamiento?

Editar: Por nueva línea me refiero a ASCII 0x0A. No hay retornos de carro en esta salida.

Respuesta1

Gracias al segundo comentario de Bruce, pude resolver el problema por mi cuenta.

Después de ejecutar stty -a -F /dev/ttyS1, encontré 3 opciones que contribuyeron al problema: "echo", "onlcr" e "icrnl".

Dado que este puerto serie está conectado a sí mismo, esto es lo que sucedió después de la ejecución echo "hi" > /dev/ttyS1:

  1. El echocomando agrega una nueva línea al final del mensaje de forma predeterminada, por lo que "hola" + LF se envía a /dev/ttyS1
  2. Debido a que se configuró "onlcr", el dispositivo serie convirtió LF a CRLF, por lo que el mensaje físico enviado a la línea Tx fue "hola" + CRLF
  3. Debido a que se configuró "icrnl", el mensaje físico recibido en la línea Rx convirtió el CR en LF. Entonces el mensaje emitido por 'gato' fue "hola" + LFLF.
  4. Debido a que se configuró "eco", el mensaje recibido en el Rx ("hola" + LFLF) se envió de nuevo a la línea Tx.
  5. Debido a onlcr, "hola" + LFLF se convirtió en "hola" + CRLFCRLF.
  6. Debido a icrnl, "hola" + CRLFCRLF se convirtió en "hola" + LLFLFLFLF
  7. Debido al eco, se envió "hola" + LLFLFLFLF al Tx

Etcétera...

Para solucionar este problema, ejecuté el siguiente comando:

stty -F /dev/ttyS1 -echo -onlcr

Deshabilitar "echo" evita un bucle infinito de mensajes y deshabilitar "onlcr" evita que el dispositivo serie convierta LF a CRLF en la salida. Ahora catrecibe un "hola" (¡con una sola nueva línea!) cada vez que ejecuto echo.

CR = retorno de carro (ASCII 0x0D); LF = avance de línea o nueva línea (ASCII 0x0A)

Respuesta2

También tuve un problema similar al concatenar archivos en un tty en serie para realizar pruebas. Además de la respuesta aceptada:

Si está probando la salida en serie haciendo algo como: cat somefile.txt > /dev/ttyS0, tendrá una buena cantidad de datos de bytes inesperados si está probando valores de bytes exactos.

Al sttyhacer un simple, stty raw -F /dev/ttyS0el terminal dejará de insertar/reemplazar caracteres (por ejemplo, [...] 0x0A [...]-> [...] 0x0D 0x0A [...]). La rawbandera cambia los modos del terminal para que no se realice ningún procesamiento de entrada y salida.

información relacionada