Não é possível alterar a taxa de transmissão no dispositivo serial USB

5

Eu recentemente atualizei para o Ubuntu 12.04 de 10.04. Em 10.04 eu não tive nenhum problema usando o driver usbserial para conectar a um dispositivo através da porta serial. Após a atualização geralmente não consigo redefinir a taxa de transmissão: ela é inicializada em 9600, mas meu dispositivo precisa de 115200. Quando tento redefinir a velocidade, obtenho:

$ sudo stty -F /dev/ttyUSB0 
speed 9600 baud; line = 0;
-brkint -imaxbel
$ sudo stty -F /dev/ttyUSB0 115200
stty: /dev/ttyUSB0: unable to perform all requested operations
$ sudo setserial -av /dev/ttyUSB0
Cannot get serial info: Invalid argument
$ ls -l /dev/ttyUS*
crw-rw---- 1 root dialout 188, 0 Nov 26 10:21 /dev/ttyUSB0
crw-rw---- 1 root dialout 188, 1 Nov 26 10:21 /dev/ttyUSB1

O mais curioso é que consegui que isso funcionasse de vez em quando. A primeira vez que eu reiniciei o sistema, e funcionou. Depois de um desligamento teve o mesmo problema e reiniciar não funcionou, mas recarregando o driver fez. Infelizmente isso não funcionou desde:

$ sudo modprobe -r usbserial
$ sudo modprobe usbserial vendor=0x0403 product=0x6001
$ sudo stty -F /dev/ttyUSB0 115200
stty: /dev/ttyUSB0: unable to perform all requested operations
    
por russell 26.11.2012 / 03:34

2 respostas

1

Dispositivos USB para serial, como as séries Prolific ou FTDI, não seguem nenhuma especificação oficial. Em vez disso, eles usam dois pontos de extremidade em massa (um para saída, um para entrada) com mensagens específicas de controle específicas do fornecedor usadas para configurar itens como a taxa de transmissão. Portanto, não é surpresa se algo como o driver usbserial genérico tiver problemas para definir taxas de baudrates ou executar outras tarefas de configuração em um chip FTDI. Como você percebeu, usar ftdi_sio funcionará muito melhor.

Mesmo o 10.04 deve estar carregando ftdi_sio por padrão, já que o ftdi_sio foi codificado para lidar com dispositivos 4003: 6001 (FT232) por quase tanto tempo quanto o Ubuntu existe. Meu palpite é que você estava carregando dois drivers que foram ambos registrados para lidar com 4003: 6001 - um por design, um devido aos parâmetros do módulo. Mudar seu kernel ou até mesmo a fase da lua pode significar que um deles será carregado antes do outro - e se usbserial for carregado primeiro, você não poderá definir a taxa de transmissão. Você deve remover a configuração manual usbserial e deixar ftdi_sio manipular o dispositivo. Ele funcionará em 10.04 e 12.04.

    
por 26.11.2012 / 19:40
1

Acho que encontrei a solução para isso, caso alguém o use no futuro. Meu 10.04 não carregou usbserial por padrão, então eu tive que fazê-lo com modprobe usbserial vendor=0x0403 product=0x6001 , que eu adicionei a /etc/modules . Após a atualização, meu 12.04 carrega o driver ftdi_sio por padrão, que é para o dispositivo incorporado que estou usando. Eu não mudei meu /etc/modules de volta, então usbserial estava sendo carregado também, e provavelmente causando algum tipo de conflito. Eu removi usbserial de /etc/modules e reiniciei, e funcionou.

Se eu estivesse realmente confiante nessa solução, eu a confirmaria reiniciando minha máquina novamente e vendo se a porta serial estava funcionando corretamente - mas eu me sentiria muito bobo se eu reiniciasse e perdesse a conexão, já que preciso trabalho feito enquanto eu tenho isso.

    
por 26.11.2012 / 17:14