![Resultados inesperados al probar el loopback en serie usando echo y cat](https://rvso.com/image/23962/Resultados%20inesperados%20al%20probar%20el%20loopback%20en%20serie%20usando%20echo%20y%20cat.png)
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 echo
y cat
en 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
:
- El
echo
comando agrega una nueva línea al final del mensaje de forma predeterminada, por lo que "hola" + LF se envía a /dev/ttyS1 - 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
- 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.
- Debido a que se configuró "eco", el mensaje recibido en el Rx ("hola" + LFLF) se envió de nuevo a la línea Tx.
- Debido a onlcr, "hola" + LFLF se convirtió en "hola" + CRLFCRLF.
- Debido a icrnl, "hola" + CRLFCRLF se convirtió en "hola" + LLFLFLFLF
- 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 cat
recibe 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 stty
hacer un simple, stty raw -F /dev/ttyS0
el terminal dejará de insertar/reemplazar caracteres (por ejemplo, [...] 0x0A [...]
-> [...] 0x0D 0x0A [...]
). La raw
bandera cambia los modos del terminal para que no se realice ningún procesamiento de entrada y salida.