Comment faire correspondre un périphérique ttyUSBX à un périphérique série USB

21

le pilote d'option correspondait correctement à l'ID USB et charge le pilote pour ce périphérique. Par exemple

# lsusb
Bus 001 Device 002: ID 19d2:0031 ONDA Communication S.p.A. ZTE MF636
Bus 001 Device 003: ID 12d1:14ac Huawei Technologies Co., Ltd.

Il crée également des périphériques ttyUSBX pour gérer le matériel

crw-rw---- 1 root uucp 188, 0 Jul  4 13:48 /dev/ttyUSB0
crw-rw---- 1 root uucp 188, 1 Jul  4 13:49 /dev/ttyUSB1
crw-rw---- 1 root uucp 188, 2 Jul  4 13:35 /dev/ttyUSB2
crw-rw---- 1 root uucp 188, 3 Jul  4 13:37 /dev/ttyUSB3
crw-rw---- 1 root uucp 188, 4 Jul  4 13:37 /dev/ttyUSB4
crw-rw---- 1 root uucp 188, 5 Jul  4 13:37 /dev/ttyUSB5
crw-rw---- 1 root uucp 188, 6 Jul  4 13:37 /dev/ttyUSB6
crw-rw---- 1 root uucp 188, 7 Jul  4 13:37 /dev/ttyUSB7

Cependant, j'ai plus d'un périphérique série USB et je veux savoir quel ttyUSB est pour quel USBID. Ex. / dev / ttyUSB1 -> 19d2: 0031

Savez-vous à quel moment je peux obtenir ces informations?

Seaquest
la source
Si vous connaissez des détails tels que le fournisseur / produit, alors cette réponse est excellente
earcam

Réponses:

12

Jetez un œil au système de fichiers sysfs. Un exemple pour ma série USB:

$ lsusb
Bus 003 Device 016: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
$ ls -l /sys/bus/usb-serial/devices
lrwxrwxrwx 1 root root 0 Jul  4 17:37 ttyUSB0 -> ../../../devices/pci0000:00/0000:00:1c.0/0000:02:00.0/usb3/3-1/3-1:1.0/ttyUSB0
$ $ grep PRODUCT= /sys/bus/usb-serial/devices/ttyUSB0/../uevent
PRODUCT=67b/2303/300

Comme vous pouvez le voir, ttyUSB0mappe sur 067b:2303sur mon ordinateur. D'autres endroits méritent d'être explorés /sys/class/tty/. Faites attention aux liens symboliques.

Lekensteyn
la source
avez-vous fait quelque chose pour faire figurer également le PRODUIT?
Igor Stoppa
@IgorStoppa, essayez catle ueventfichier à partir du résultat de find /sys -name ttyACM0, par exemple. Remplacez le nom de nœud de votre périphérique série.
sherrellbc
9

Vous pouvez essayer de voir si vos appareils sont enregistrés sous / dev / serial / by-id /

ls -l / dev / serial / by-id

Ces noms doivent être cohérents et pointeront (lien symbolique) vers le ttyUSBx correct

Waxhead
la source
Pouvez-vous ajouter des clarifications, des exemples, etc. La réponse en ligne ne compte pas aussi bien en SE
Romeo Ninov
@RomeoNinov Ok, j'ai ajouté quelques éclaircissements comme vous l'aviez demandé. Ce n'est pas exactement plus difficile que de simplement regarder dans un autre répertoire, donc je ne vois pas comment rendre la réponse plus élaborée qu'elle ne va rien améliorer. Désolé pour ça.
Waxhead
J'ai deux adaptateurs identiques (deux Arduinos) connectés à un Raspberry Pi. ls -l /dev/serial/by-idne renvoie qu'un seul adaptateur ../../ttyUSB1, alors qu'il ls -l /sys/bus/usb-serial/devicesme montre les deux. Je ne pense donc pas que ce soit une bonne réponse.
Daniel F
6

J'ai eu un problème similaire .

Écrivez ceci à /etc/udev/rules.d/50-usb.rules

SUBSYSTEM=="tty", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0031", SYMLINK+="ONDA"
SUBSYSTEM=="tty", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14ac", SYMLINK+="HUAWEI"

jusqu'à la fin. Redémarrez.

Vous pouvez maintenant utiliser /dev/ONDApour accéder à votre appareil ONDA.

Si vous souhaitez que les utilisateurs non root puissent les utiliser, ajoutez

, MODE="0666"

à la fin de chaque ligne.

Nick ODell
la source
J'ai fait cela et vérifié les fichiers vers lesquels ils sont liés. le produit que j'ai possède plusieurs interfaces, comme un disque solide, une série USB. Alors que je m'attendais à la liaison avec / dev / ttyACM0 mais c'était à / dev / sda. est-il possible de définir dans le fichier de règles quel type d'appareil la règle doit appliquer? J'ai écrit les règles dans /etc/udev/rules.d/99-ftdi.rules
nurp
ok l'a trouvé: ajouté SUBSYSTEM == "tty" aux paramètres de la règle. cette valeur peut être trouvée dans la sortie de udevadm info --name=/dev/ttyACM0
nurp
3

J'utiliserais udev et j'écrirais quelques règles qui créent des liens symboliques pour les appareils.

Pour obtenir suffisamment d'informations pour distinguer les appareils, essayez quelque chose comme ceci pour tous les appareils:

$ udevadm info --query all --name /dev/ttyUSB0 --attribute-walk
Mathias Weidner
la source
1

Les commandes suivantes me donneront la liste des noms de périphériques ttyUSB associés à 19d2: 0016 (qui est l'identifiant de "mode modem" d'une clé ZTE MF831 LTE, le vôtre peut différer.):

    for i in $(find -L /sys/bus/usb/devices/ -maxdepth 2 -name "ttyUSB*"); do
        egrep -i "v19d2p0016(.*)in02" $i/../modalias >/dev/null && echo "/dev/${i##*/}"
    done

Cela va parcourir une liste de fichiers avec le nom de fichier ttyUSB *, y compris les liens symboliques, dans / sys / bus / usb / devices. Dans les résultats, nous rechercherons un fichier nommé modalias et rechercherons une chaîne contenant l'ID de fournisseur "v" "19d2" et l'ID de produit "p" 0016. Si la sortie correspond, nous ferons écho à une chaîne préfixée avec "/ dev / "devant l'USB? Nom. Afaik le premier ou généralement le dernier (numéro le plus élevé) est le port modem pour les appareils ZTE. Vous pouvez répercuter les résultats dans un fichier dans / tmp / et head -n1 ou tail -n1 les lignes en conséquence. Si vous avez des concentrateurs, vous devrez probablement augmenter la profondeur maximale.

Ce n'est pas la manière la plus élégante, mais cela fonctionnera sur presque toutes les variantes de Linux.

epek
la source