Por que a enumeração da porta USB muda?

10

Estou usando um modem USB Huawei GMS / UMTS com Gnokii e Gammu. O modem estava na porta inferior do Pi. Com dmesg | grep ttyisso apareceria /dev/ttyUSB0e /dev/ttyUSB1. (2 dispositivos USB em um stick são normais, neste caso).

Eu configurei o Gnokii e o Gammu adequadamente, no entanto, no ttyUSB0, eu só podia enviar mensagens. Tanto o envio quanto o recebimento funcionariam apenas em ttyUSB1.

Em seguida, mudei o stick para o soquete USB superior (porque, caso contrário, meu WiFi-stick não caberia ao lado). Tudo continuou funcionando bem. Também após várias reinicializações, frio e quente.

Eu então precisei expandir o sistema de arquivos (Sim, eu sei que deveria ter feito isso antes). Depois disso, o modem estava em ttyUSB0 e ttyUSB * 2 *. Enviar / receber trabalhado no último. Levei algum tempo para descobrir.

Atualização: 2 dias depois, o ttyUSB2 desapareceu. O modem em funcionamento agora se manifesta no ttyUSB0 (era ttyUSB1).

Alguma idéia de por que isso aconteceu? Algum link para os documentos debian ou linux relevantes, talvez? Eu ficaria muito grato ..

RolfBly
fonte
Tente usar os nomes /sys/class/tty/como guia.
Lekensteyn
Os únicos ttyUSBs em / sys / class / tty são ttyUSB0 e ttyUSB1. Agora. Quem sabe o que será amanhã.
RolfBly
A enumeração USB muda por design, você conecta um novo dispositivo e obtém um novo número. ou talvez um dispositivo antigo enquanto o número da porta anterior ainda estiver ocupado com transferências inacabadas. tente não reconectar dispositivos muito cedo e verifique se todos os softwares que usam esses dispositivos terminaram seus negócios com prazer.
lenik

Respostas:

16

A documentação Gammu sugere (mas não entra em detalhes de) uma solução alternativa,

Editar: o Atmel possui uma nota de aplicação que descreve bem o processo de enumeração.

A enumeração é alterada porque ocorre em uma conversa entre host, hub e dispositivo e o tempo de resposta de cada uma delas pode variar, mesmo se a configuração for idêntica de uma reinicialização para a seguinte.

Atualização: a solução não é facilmente encontrada on-line e está espalhada em pedaços por todo o lugar. Então, reuni tudo em um documento . É para isso que tudo se resume.
1. descubra o que está no ttyUSB:

dmesg | grep ttyUSB  

2. liste todos os atributos do dispositivo e escolha um conjunto de identificadores exclusivo, por exemplo, idVendor + idProduct (e, se necessário, SerialNumber, se você tiver mais de um dispositivo com o mesmo idVendor e idProduct).

udevadm info --name=/dev/ttyUSB1 --attribute-walk

3. Crie um arquivo /etc/udev/rules.d/99-usb-serial.rulescom algo como esta linha:

SUBSYSTEM=="tty", ATTRS{idVendor}=="1234", ATTRS{idProduct}=="5678", SYMLINK+="your_device_name" 

(supondo que você não precise de um número de série e, obviamente, com os números de idVendor e idProduct que você encontrou na etapa 2.
4. Carregue a nova regra:

sudo udevadm trigger

5. Verifique o que aconteceu:

ls -l /dev/your_device_name  

mostrará para qual número ttyUSB o link simbólico foi. Se for /dev/ttyUSB1, verifique quem é o proprietário e a qual grupo pertence:

ls -l /dev/ttyUSB1   

Então, apenas por diversão:

udevadm test -a -p  $(udevadm info -q path -n /dev/your_device_name)
RolfBly
fonte
8

Você respondeu parcialmente à sua própria pergunta, mas há outra maneira de fazer isso, especialmente para dispositivos seriais: os /dev/serial/*caminhos. Eu tenho uma interface USB → RS232 Prolific no meu Raspberry Pi, que quase sempre aparece como /dev/ttyUSB0. Mas também aparece no sistema como:

  • /dev/serial/by-path/platform-bcm2708_usb-usb-0:1.3:1.0-port0
  • /dev/serial/by-id/usb-067b_2303-if00-port0

O uso do by-idlink deve permanecer o mesmo, a menos que eu adicione outro conversor baseado em PL2303.

scruss
fonte
..E quando alguém realmente adiciona um novo conversor baseado em PL2303. (2 deles) então o que pode ser feito?
Obmerk Kronen
Você está preso. Prefiro misturar e combinar marcas para evitar isso.
Scruss
Isso foi imensamente útil para uma porta serial que estava mudando para mim em Python - obrigado!
GhostToast