Pourquoi l'énumération des ports USB change-t-elle?

10

J'utilise un modem USB Huawei GMS / UMTS avec Gnokii et Gammu. Le modem était dans le port inférieur sur Pi. Avec dmesg | grep ttycela, il apparaîtrait sur /dev/ttyUSB0et /dev/ttyUSB1. (2 périphériques USB sur 1 bâton est normal, dans ce cas).

J'ai configuré Gnokii et Gammu en conséquence, mais sur ttyUSB0 je ne pouvais envoyer que des messages. L'envoi et la réception ne fonctionneraient que sur ttyUSB1.

J'ai ensuite déplacé la clé sur la prise USB supérieure (car sinon ma clé WiFi ne tiendrait pas à côté). Tout fonctionnait bien. Aussi après plusieurs redémarrages, froid et chaud.

J'ai ensuite dû étendre le système de fichiers (ouais, je sais que j'aurais dû le faire plus tôt). Après cela, le modem était sur ttyUSB0 et ttyUSB * 2 *. Envoyer / recevoir travaillé sur ce dernier. Cela m'a pris un peu de temps pour le découvrir.

Mise à jour: 2 jours plus tard, ttyUSB2 a disparu. Le modem de travail se manifeste maintenant sur ttyUSB0 (était ttyUSB1).

Une idée de pourquoi c'est arrivé? Des liens vers des documents Debian ou Linux pertinents, peut-être? Je serais très obligé ..

RolfBly
la source
Essayez d'utiliser les noms /sys/class/tty/comme guide.
Lekensteyn
Les seuls ttyUSB dans / sys / class / tty sont ttyUSB0 et ttyUSB1. Maintenant. Qui sait ce que ce sera demain.
RolfBly
L'énumération USB change par conception, vous branchez un nouvel appareil et obtenez un nouveau numéro. ou peut-être un ancien appareil alors que le numéro de port précédent est toujours occupé avec des transferts inachevés. essayez de ne pas reconnecter les appareils trop tôt et assurez-vous que tous les logiciels utilisant ces appareils ont bien terminé leur activité.
lenik

Réponses:

16

La documentation de Gammu suggère (mais n'entre pas dans les détails) une solution de contournement,

Edit: Atmel a une note d'application qui décrit bien le processus d'énumération.

L'énumération change car elle se produit dans une conversation entre l'hôte, le concentrateur et le périphérique, et le délai de réponse de chacun d'eux peut varier, même si la configuration est identique d'un redémarrage à l'autre.

Mise à jour: La solution n'est pas facile à trouver en ligne et dispersée en morceaux partout. J'ai donc tout rassemblé dans un seul document . Voilà à quoi cela se résume.
1. découvrez ce qui est sur ttyUSB:

dmesg | grep ttyUSB  

2. répertoriez tous les attributs de l'appareil et choisissez un ensemble d'identificateurs uniques, par exemple idVendor + idProduct (et si nécessaire SerialNumber si vous avez plusieurs appareils avec les mêmes idVendor et idProduct).

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

3. Créez un fichier /etc/udev/rules.d/99-usb-serial.rulesavec quelque chose comme cette ligne:

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

(en supposant que vous n'y ayez pas besoin d'un numéro de série, et bien sûr avec les numéros pour idVendor et idProduct que vous avez trouvés à l'étape 2.
4. Chargez la nouvelle règle:

sudo udevadm trigger

5. Vérifiez ce qui s'est passé:

ls -l /dev/your_device_name  

montrera à quel numéro ttyUSB le lien symbolique est allé. Si c'est le cas /dev/ttyUSB1, vérifiez à qui appartient cette propriété et à quel groupe elle appartient:

ls -l /dev/ttyUSB1   

Alors juste pour le plaisir:

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

Vous avez partiellement répondu à votre propre question, mais il existe une autre façon de le faire, en particulier pour les périphériques série: les /dev/serial/*chemins. J'ai une interface Prolific USB → RS232 sur mon Raspberry Pi qui apparaît presque toujours comme /dev/ttyUSB0. Mais il apparaît également sur le système comme:

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

L'utilisation du by-idlien doit rester la même, sauf si j'ajoute un autre convertisseur basé sur PL2303.

scruss
la source
..Et quand quelqu'un ajoute vraiment un nouveau convertisseur basé sur PL2303. (2 d'entre eux) alors que peut-on faire?
Obmerk Kronen
Tu es coincé. Je préfère mélanger et assortir les marques pour éviter cela.
scruss
Cela a été extrêmement utile pour un port série qui changeait pour moi en Python - merci!
GhostToast