Resultados inesperados testando loopback serial usando eco e cat

17

Então, eu tenho uma porta serial RS232 padrão que volta a si mesma simplesmente executando um fio de Tx a 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" voltar no terminal rodando o gato, mas, em vez disso, recebo o seguinte:

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 emitirá "oi" até que eu execute o eco pela segunda vez.

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

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

Cristina
fonte
Poderia ser causado por dois processos abrindo o mesmo dispositivo? E se você executar tip /dev/ttyS1( ~.para sair) e tentar digitar dados lá? Ele deve ser exibido no seu terminal quando o fio estiver conectado, pois recebe o que foi transmitido.
Mrb
3
Você está realmente recebendo novas linhas ou um par de retorno de carro / nova linha? A distinção é importante no nível em que você está trabalhando. Experimente "cat / dev / ttyS1> somefile" e faça "od -x somefile" para ver exatamente quais bytes estão saindo do arquivo de dispositivo TTY. Além disso, faça um "stty -F / dev / ttyS1 -a". Leia a página de manual para "stty" e veja o que a saída do stty lhe diz, para cada pequena configuração. As comunicações seriais RS232 são complicadas.
22612 Bruce Ediger

Respostas:

21

Graças ao segundo comentário de Bruce, consegui resolver o problema por conta própria.

Após a execução stty -a -F /dev/ttyS1, foram encontradas três opções que contribuíram para o problema: "eco", "onlcr" e "icrnl".

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

  1. O echocomando anexa 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. Portanto, a mensagem emitida por 'cat' era "oi" + LFLF.
  4. Como "eco" foi definido, a mensagem recebida no Rx ("oi" + LFLF) foi enviada novamente na linha Tx.
  5. Por causa do onlcr, "oi" + LFLF se tornou "oi" + CRLFCRLF.
  6. Por causa do icrnl, "oi" + CRLFCRLF se tornou "oi" + LFLFLFLF
  7. Por causa do eco, "hi" + LFLFLFLF foi enviado o Tx

E assim por diante...

Para corrigir esse problema, executei o seguinte comando:

stty -F /dev/ttyS1 -echo -onlcr

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

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

Cristina
fonte
-icrnlfez o truque para mim.
tcpaiva 26/09/19
3

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:, haverá uma boa quantidade de dados de bytes inesperados se estiver testando valores exatos de bytes.

Ao sttyfazer um simples stty raw -F /dev/ttyS0, o terminal não poderá 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.

eu preciso dormir
fonte
1
Hmm ... não parece stty rawdesabilitar o eco por padrão. Você pode precisar fazer stty raw -echo.
BMiner