Quais são as implicações de definir a taxa de transmissão de um terminal do espaço do usuário?

3

Às vezes, só preciso ler em um dispositivo serial, então pulo as complexidades de minicom ou screen e apenas cat . No entanto, isso só funciona se eu definir primeiro a taxa de transmissão do terminal usando stty <baud> antes de tentar abrir o arquivo.

Esses dados provavelmente já estão (ou podem ser) armazenados em buffer no kernel e, nesse caso, foram recebidos por meio de um ponte UART para USB . As taxas de transferência USB são fixas para um determinado padrão, portanto, a configuração da taxa de transmissão só pode afetar a interpretação dos dados. Dada a minha falta de percepção sobre o que esses dados podem parecer envoltos em pacotes USB, não tenho certeza de como visualizar a "interpretação" dos dados de pacote USB em alguma taxa de leitura fixa (taxa de transmissão).

$ stty 115200
$ cat /dev/ttyACM0

O que realmente está acontecendo aqui? Eu entendo as implicações dessa configuração no hardware, mas o que isso significa no software userspace ?

    
por sherrellbc 29.08.2017 / 15:11

1 resposta

7

Parece que você pode estar um pouco confuso sobre como tudo isso funciona.

Primeiro, /dev/ttyACM0 não representa o link USB nem o terminal USB de qualquer adaptador serial conectado. Ele representa o UART dentro do adaptador que lida com as comunicações seriais. Os dados que você leu não incluirão nenhum cabeçalho ou quadro USB, assim como os dados que você leu em /dev/ttyS0 não incluirão nenhum cabeçalho ou quadro PCI Express. Definir a taxa de transmissão nestes afeta o hardware que representa, não o barramento ao qual está conectado, então isso não fará nada com a conexão USB.

Em segundo lugar, a taxa de transmissão é uma configuração de hardware, não de software. Quando você chama stty para configurá-lo em uma porta serial, isso está dizendo ao kernel para dizer ao hardware para alterar qual baud rate ele está tentando receber dados. Isso significa, em particular, que quaisquer dados que foram recebidos antes dessa alteração serão falsos (porque não foram interpretados corretamente pelo hardware, às vezes, o caso se as taxas de transmissão estiverem próximas umas das outras ou harmônicos exatos) ou completamente perdidas (porque o hardware simplesmente não aceitou, o caso mais provável no hardware moderno).

Se você planeja ler dados de uma linha serial, você precisa ter a taxa de transmissão definida corretamente antes de qualquer dado ser transmitido pela outra extremidade. Isso também significa que a alteração da taxa de transmissão não altera como o kernel interpreta os dados. Se os dados já estiverem armazenados em buffer no kernel, então ele não irá mudar apenas porque você altera a taxa de transmissão (embora seja uma boa prática depois de alterar a taxa de transmissão para drenar os buffers do kernel para que você saiba que dados futuros são bons).

Portanto, para esclarecer, o método correto para obter dados de um adaptador USB para serial sem usar um software especial é:

  1. Defina a taxa de transmissão durante a inicialização do sistema. Para um adaptador USB para serial, essa provavelmente deve ser uma regra do udev para que seja configurada quando o dispositivo também for conectado.
  2. Use cat (ou od se você precisar dos valores de bytes em vez de texto) para ler os dados. Isso retornará os dados exatos recebidos pelo adaptador USB para serial (assegurando que o adaptador não faça processamento especial).
por 29.08.2017 / 16:13