![Resultados inesperados testando loopback serial usando echo e cat](https://rvso.com/image/23962/Resultados%20inesperados%20testando%20loopback%20serial%20usando%20echo%20e%20cat.png)
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 echo
e cat
em 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
:
- O
echo
comando acrescenta uma nova linha ao final da mensagem por padrão, então "hi" + LF é enviado para /dev/ttyS1 - 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
- 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.
- Como o "eco" foi definido, a mensagem recebida no Rx ("hi" + LFLF) foi então enviada de volta na linha Tx.
- Por causa do onlcr, "hi" + LFLF tornou-se "hi" + CRLFCRLF.
- Por causa do icrnl, "hi" + CRLFCRLF tornou-se "hi" + LLFLFLFLF
- 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 cat
recebe 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 stty
um simples stty raw -F /dev/ttyS0
impedirá o terminal de inserir/substituir caracteres (por exemplo [...] 0x0A [...]
-> [...] 0x0D 0x0A [...]
). O raw
sinalizador altera os modos do terminal para que nenhum processamento de entrada e saída seja executado.