web-dev-qa-db-fra.com

Comment savoir quel périphérique USB-RS232 se trouve sur quel terminal?

J'ai deux périphériques USB différents basés sur les mêmes puces USB-RS232. Lorsque je branche ceux-ci dans l'USB, ils sont montés sur /dev/ttyUSB0...3

Mon problème est de savoir comment, dans un script, je peux savoir lequel est sur quel tty?

En utilisant lsusb, je peux les différencier:

$> lsusb | grep 0403:f850
Bus 004 Device 002: ID 0403:f850 Future Technology Devices International, Ltd
$> lsusb | grep 0403:6001
Bus 004 Device 003: ID 0403:6001 Future Technology Devices International, Ltd FT232 USB-Serial (UART) IC

Et en utilisant dmesg, je peux dire où ils ont été montés:

$> dmesg | grep 'FTDI USB Serial Device converter now attached'
[36051.393350] usb 4-2: FTDI USB Serial Device converter now attached to ttyUSB1
[36061.823513] usb 4-1: FTDI USB Serial Device converter now attached to ttyUSB0

Mais "usb 4-1" ne semble pas correspondre à "Bus 004 Device 002".

Puis-je supposer que "Bus 004 Device 001" sera toujours un "concentrateur racine USB" et donc dmesg comptera à partir de 1 et lsusb à partir de 2?

Ou avez-vous une autre suggestion sur la façon de corréler l'ID de périphérique au point de montage (à l'intérieur d'un script)?

J'utilise Ubuntu 10.04 LTS.

25
gabriel_agm

Trouvez plus d'informations en utilisant sysfs:

$ ls /sys/bus/usb-serial/devices/ -ltrah

lrwxrwxrwx 1 root root 0 2012-02-07 22:17 ttyUSB0 -> ../../../devices/pci0000:00/0000:00:0f.4/usb2/2-2/2-2:1.0/ttyUSB0

$ ls -ltrad /sys//devices/pci0000:00/0000:00:0f.4/usb2/2-2/2-2:1.0/ttyUSB0
drwxr-xr-x 4 root root 0 2012-02-07 22:17 /sys//devices/pci0000:00/0000:00:0f.4/usb2/2-2/2-2:1.0/ttyUSB0

$ ls -ltrad /dev/ttyUSB0 
crw-rw---- 1 root dialout 188, 0 2012-02-01 00:17 /dev/ttyUSB0

Bien sûr, le nœud des appareils liés/... contient beaucoup d'informations

Ajout d'informations basées sur le commentaire du PO:

Le numéro d'appareil ne cesse d'augmenter si des appareils sont retirés/insérés. lsusb -t peut être utilisé pour corréler les numéros de périphérique avec le bus/port USB.

Ensuite, 'lsusb -d devID' peut déterminer quel périphérique se trouve sur quel port. Enfin, 'ls/sys/bus/usb-serial/devices/-ltrah' listera (par bus/port) où il a été monté.

Pas très pratique, mais ça 'fonctionne'

23
sehe

Vous pouvez utiliser udev pour attribuer un lien symbolique stable à chaque dongle FTDI. Utilisez le périphérique et le fournisseur pour faire correspondre le type, puis le numéro de série du périphérique spécifique. Utilisez ensuite le lien symbolique dans le script.

J'ai nommé mes dongles ttyFTDI0 etc., et j'ai écrit les numéros sur les dongles avec un marqueur:

 $ cat /etc/udev/ftdi.rules 
 SOUS-SYSTÈMES == "usb", KERNEL == "ttyUSB *", ATTRS {idVendor} == "0403", ATTRS {idProduct} = = "6001", ATTRS {serial} == "FTDEN97D", SYMLINK + = "ttyFTDI0" 
 SOUS-SYSTÈMES == "usb", KERNEL == "ttyUSB *", ATTRS {idVendor} == "0403", ATTRS {idProduct} == "6001", ATTRS {serial} == "A600b30P", SYMLINK + = "ttyFTDI1" 
 SOUS-SYSTÈMES == "usb", KERNEL == "ttyUSB *", ATTRS {idVendor} = = "0403", ATTRS {idProduct} == "6001", ATTRS {serial} == "A600bexU", SYMLINK + = "ttyFTDI2" 
 SOUS-SYSTÈMES == "usb", KERNEL == "ttyUSB *", ATTRS {idVendor} == "0403", ATTRS {idProduct} == "6001", ATTRS {serial} == "FTFMSA54", SYMLINK + = "ttyFTDI3" 
 SOUS-SYSTÈMES == "usb", KERNEL == "ttyUSB *", ATTRS {idVendor} == "0403", ATTRS {idProduct} == "6001", ATTRS {serial} == "FTFMUW4A", SYMLINK + = "ttyFTDI4" 
13
starblue

Cette règle udev à une ligne donnera un nom fixe (par exemple/dev/ttyUSB_A9YL5BJJ) basé sur le numéro de série de tout appareil avec des ID de fournisseur/produit donnés.

Mettez cela dans un fichier de règles udev, par ex. /etc/udev/rules.d/60-ftdi-serial-names.rules

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ENV{ID_SERIAL_SHORT}=="?*", SYMLINK+="ttyUSB_%E{ID_SERIAL_SHORT}"
1