Resultados inesperados que prueban el loopback serial usando echo y cat


17

Así que tengo un puerto serie RS232 estándar que se vuelve a conectar a sí mismo simplemente ejecutando un cable de Tx a Rx. Estoy probando 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" volver en la terminal con gato, pero en cambio obtengo esto:

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

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

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

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

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


¿Podría ser causado por tener dos procesos abriendo el mismo dispositivo? ¿Qué sucede si ejecuta tip /dev/ttyS1( ~.para salir) e intenta escribir datos allí? Debe mostrarse en su terminal cuando el cable está conectado, ya que recibe lo que ha transmitido.
mrb

3
¿ Realmente estás recibiendo líneas nuevas o un par de retorno de carro / línea nueva? La distinción es importante en el nivel en el que estás trabajando. Pruebe "cat / dev / ttyS1> somefile" y luego haga "od -x somefile" para ver exactamente qué bytes salen del archivo del dispositivo TTY. Además, haga un "stty -F / dev / ttyS1 -a". Lea la página de manual para "stty" y mire lo que le dice la salida de stty, para cada pequeño ajuste. Las comunicaciones serie RS232 son complicadas.
Bruce Ediger

Respuestas:


21

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 para contribuir al problema: "echo", "onlcr" e "icrnl".

Dado que este puerto serie se vuelve a conectar en sí mismo, esto es lo que sucedió después de ejecutarse echo "hi" > /dev/ttyS1:

  1. El echocomando agrega una nueva línea al final del mensaje de forma predeterminada, por lo que se envía "hola" + LF a / dev / ttyS1
  2. Debido a que se configuró "onlcr", el dispositivo serial convirtió el LF a CRLF, por lo que el mensaje físico enviado a la línea Tx fue "hola" + CRLF
  3. Como se configuró "icrnl", el mensaje físico recibido en la línea Rx convirtió el CR a LF. Entonces, el mensaje emitido por 'cat' fue "hola" + LFLF.
  4. Debido a que se configuró "echo", el mensaje recibido en el Rx ("hi" + LFLF), se envió nuevamente 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" + LFLFLFLF
  7. Debido al eco, "hola" + LFLFLFLF se envió el Tx

Y así...

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 nueva línea nueva!) Por cada vez que corro echo.

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


-icrnlhizo el truco para mí
tcpaiva

3

También tuve un problema similar con la concatenación de archivos en un tty serial para pruebas. Además de la respuesta aceptada:

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

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


1
Hmm ... no parece stty rawque deshabilitará el eco por defecto. Puede que tenga que hacer stty raw -echo.
BMiner
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.