Resultados inesperados testando loopback serial usando echo e cat

12

Portanto, eu tenho uma porta serial padrão RS232 que é colocada em loop de volta para si mesma, simplesmente executando 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 "hi" voltar no terminal rodando cat mas em vez disso eu recebo isso:

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

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

Depois de interromper o cat, se eu o executar novamente, ele não emitirá "oi" s até eu executar o eco pela segunda vez.

Isso é normal? Alguma ideia de porque estou vendo esse comportamento?

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

    
por Ryan 13.07.2012 / 16:24

2 respostas

15

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

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

Como esta porta serial é retornada para si mesma, eis o que aconteceu depois de executar echo "hi" > /dev/ttyS1 :

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

E assim por diante ...

Para corrigir esse problema, executei o seguinte comando:

stty -F /dev/ttyS1 -echo -onlcr

Desativar "echo" evita um loop infinito de mensagens e a desativação de "onlcr" impede 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 eu corro echo .

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

    
por 13.07.2012 / 20:04
3

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

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

Com stty fazendo um simples stty raw -F /dev/ttyS0 , o terminal impedirá a inserção / substituição de caracteres (por exemplo, [...] 0x0A [...] - > [...] 0x0D 0x0A [...] ). O sinalizador raw altera os modos do terminal para que nenhum processamento de entrada e saída seja executado.

    
por 05.02.2013 / 00:08