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 . Está ligado a um dispositivo que periodicamente envia uma cadeia a 9600 baud. No entanto, pareço ser capaz de receber os dados, independentemente de como eu 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 há algo errado com stty , pois screen funciona como esperado. screen /dev/ttyUSB0 9600 mostra os dados, enquanto screen /dev/ttyUSB0 115200 não produz saída.

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

    
por Dmitry Grigoryev 31.12.2016 / 19:47

1 resposta

2

I suppose there's something wrong with stty ...
...
Is there something I'm missing in the attempt to configure UART baudrate with stty?

Sim, seu teste é falho, 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 115.200 baud).
  • O comando cat tem um capricho que pode fazer com que ele não libere buffers stdio, a menos que encontre um caractere de terminação de linha. Os comandos cat sucessivos do IOW podem exibir os mesmos dados quando não houver término de linha. A resposta aceita para esta questão alude a esta questão.

Sua escolha particular e a sequência de comandos do shell funcionam em conjunto para ajudar você a concluir incorretamente.

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

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

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

Após 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.
Quando você emite outro comando cat , você verá uma exibição dos mesmos dados que foram recebidos anteriormente (ou seja, antes da alteração da taxa de transmissão).

Adendo

Você deve ser capaz de pelo menos se convencer de que o comando stty não está quebrado e altera a taxa de transmissão como esperado.
Qualquer um:

Em vez de mudar para uma taxa de transmissão muito rápida (que não pode detectar qualquer enquadramento), mude para um baud moderado de 38400 ou 4800 bauds mais lento, o que deve causar recepção / exibição de caracteres ilegíveis (em vez de dados válidos ou nada).

Ou

Troque a ordem das baudrates. Redefinir os sistemas e usar 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 começar a receber os dados conforme o esperado.

    
por 01.01.2017 / 11:16