Resultados inesperados testando loopback serial usando echo e cat

Resultados inesperados testando loopback serial usando echo e cat

Portanto, eu tenho uma porta serial RS232 padrão que retorna a si mesma simplesmente passando um fio de Tx para Rx. Estou testando o loopback executando echoe catem dois terminais separados:

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

Meu problema é com a saída. Eu esperaria ver um "oi" voltando no terminal executando cat, mas em vez disso recebo isto:

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

... e assim por diante até eu ctrl+ c cat.

Depois de interromper o gato, se eu executá-lo novamente, ele não exibirá "oi" até que eu execute o echo pela segunda vez.

Isso é normal? Alguma ideia de por que estou vendo esse comportamento?

Editar: Por nova linha, quero dizer ASCII 0x0A. Não há retornos de carro nesta saída.

Responder1

Graças ao segundo comentário de Bruce, consegui descobrir o problema sozinho.

Depois de executar o stty -a -F /dev/ttyS1, encontrei 3 opções que contribuíram para o problema: "echo", "onlcr" e "icrnl".

Como essa porta serial retorna a si mesma, eis o que aconteceu após a execução echo "hi" > /dev/ttyS1:

  1. O echocomando acrescenta uma nova linha ao final da mensagem por padrão, então "hi" + LF é enviado para /dev/ttyS1
  2. Como "onlcr" foi definido, o dispositivo serial converteu o LF em CRLF, de modo que a mensagem física enviada pela linha Tx foi "hi" + CRLF
  3. Como "icrnl" foi definido, a mensagem física recebida na linha Rx converteu o CR em LF. Portanto, a mensagem emitida por 'cat' foi "hi" + LFLF.
  4. Como o "eco" foi definido, a mensagem recebida no Rx ("hi" + LFLF) foi então enviada de volta na linha Tx.
  5. Por causa do onlcr, "hi" + LFLF tornou-se "hi" + CRLFCRLF.
  6. Por causa do icrnl, "hi" + CRLFCRLF tornou-se "hi" + LLFLFLFLF
  7. Por causa do echo, "hi" + LFLFLFLF foi então enviado o Tx

E assim por diante...

Para corrigir esse problema, executei o seguinte comando:

stty -F /dev/ttyS1 -echo -onlcr

Desabilitar "echo" evita um loop infinito de mensagens e desabilitar "onlcr" evita que o dispositivo serial converta LF em CRLF na saída. Agora catrecebe um "oi" (com uma única nova linha!) para cada vez que executo o echo.

CR = retorno de carro (ASCII 0x0D); LF = avanço de linha ou nova linha (ASCII 0x0A)

Responder2

Eu também tive um problema semelhante ao concatenar arquivos em um tty serial para teste. Além da resposta aceita:

Se você estiver testando a saída serial fazendo algo como: cat somefile.txt > /dev/ttyS0, ela terá uma boa quantidade de dados de bytes inesperados se você estiver testando valores exatos de bytes.

Fazer sttyum simples stty raw -F /dev/ttyS0impedirá o terminal de inserir/substituir caracteres (por exemplo [...] 0x0A [...]-> [...] 0x0D 0x0A [...]). O rawsinalizador altera os modos do terminal para que nenhum processamento de entrada e saída seja executado.

informação relacionada