A taxa de transmissão UART é configurável por `screen`, mas não por` stty`


0

Eu tenho um adaptador USB para serial, baseado no chip CH340G . Ele está conectado a um dispositivo que envia periodicamente uma string a 9600 baud. No entanto, pareço poder receber os dados independentemente de como configuro o UART com stty(versão 8.13):

# stty -F /dev/ttyUSB0 9600  
# stty -F /dev/ttyUSB0     
speed 9600 baud; line = 0;
kill = ^H; min = 100; time = 2;
-icrnl -imaxbel
-opost -onlcr
-isig -icanon -echo
# stdbuf -i0 -o0 cat /dev/ttyUSB0
data data data
^C
# stty -F /dev/ttyUSB0 115200
# stty -F /dev/ttyUSB0       
speed 115200 baud; line = 0;
kill = ^H; min = 100; time = 2;
-icrnl -imaxbel
-opost -onlcr
-isig -icanon -echo
# stdbuf -i0 -o0 cat /dev/ttyUSB0         
data data data
^C

Suponho que haja algo errado stty, pois screenfunciona como esperado. screen /dev/ttyUSB0 9600mostra os dados, enquanto screen /dev/ttyUSB0 115200não produz saída.

Há algo que estou faltando na tentativa de configurar a taxa de transmissão do UART stty?

Respostas:


1

Suponho que haja algo errado com stty...
...
Há algo que estou perdendo na tentativa de configurar a taxa de transmissão do UART com stty?

Sim, seu teste tem falhas, para que você não detecte que a taxa de transmissão foi alterada.

Alguns fatos (possivelmente obscuros):

  • Uma porta serial não pode receber nenhum dado quando os dados são enviados a uma taxa de transmissão muito mais lenta em relação à sua configuração (por exemplo, enviada a 9600 baud e recebendo a 115200 baud).
  • O comando cat possui uma peculiaridade que pode fazer com que ele não libere os buffers stdio, a menos que encontre um caractere de terminação de linha. Os comandos cat IOW sucessivos podem exibir os mesmos dados quando não houver terminação de linha. A resposta aceita a esta pergunta faz alusão a esse problema.

Sua escolha e sequência de comandos shell trabalham em conjunto para ajudar a levá-lo à sua conclusão incorreta.

# stty -F / dev / ttyUSB0 9600
# stty -F / dev / ttyUSB0
# cat / dev / ttyUSB0
dados dados dados
^ C

Então, você configura o terminal serial com a taxa de transmissão adequada e recebe alguns dados.

# stty -F / dev / ttyUSB0 115200
# stty -F / dev / ttyUSB0
# cat / dev / ttyUSB0
dados dados dados
^ C

Depois de reconfigurar com uma taxa de transmissão muito mais rápida, a porta serial provavelmente deixa de detectar quadros válidos e nenhum novo dado é recebido.
Ao emitir outro comando cat , você vê uma exibição dos mesmos dados que foram recebidos anteriormente (ou seja, antes da alteração da taxa de transmissão).


Termo aditivo

Você deve pelo menos se convencer de que o comando stty não está quebrado e alterar a taxa de transmissão conforme o esperado.
Ou:

R. Em vez de mudar para uma taxa de transmissão muito rápida (que não pode detectar nenhum enquadramento), mude para uma moderada 38400 ou 4800 mais lenta, uma das quais deve causar recepção / exibição de caracteres ilegíveis (em vez de dados válidos ou nada).

Ou

B. Troque a ordem das taxas de transmissão. Redefina os sistemas e use stty para configurar a taxa de transmissão rápida e inválida inicialmente para causar a recepção / exibição de caracteres ilegíveis ou nada.
Em seguida, use stty para configurar a taxa de transmissão adequada e comece a receber os dados conforme o esperado.


Obrigado, mas tenho terminação de linha (pense nos dados como sequências NMEA, por exemplo), e mesmo que não o fizesse, o buffer de linha impediria a catexibição de qualquer dado. Não consigo imaginar o que poderia causar cata exibição dos dados antigos, pois antes de abrir o dispositivo não há buffer para armazenar esses dados.
Dmitry Grigoryev

Eu fiz um novo teste que, esperançosamente, exclui problemas de buffer.
Dmitry Grigoryev

Sua pergunta me intriga porque encontrei na semana passada problemas semelhantes de "dados obsoletos" ao usar o adaptador USB-para-serial e o comando cat . Aparentemente, não tenho uma explicação correta e não consegui reproduzi-la. Mas veja o Adendo acima.
sawdust

Obrigado! Vou testar alguns outros adaptadores UART quando obtê-los, mas você me deu uma idéia: vou refazer meu teste com um Arduino programado para ecoar a entrada serial na saída.
Dmitry Grigoryev
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.