Cómo hacer coincidir un dispositivo ttyUSBX con un dispositivo serie usb


21

el controlador de opción coincidió correctamente con la ID de USB y carga el controlador para este dispositivo. Por ejemplo

# 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.

También crea dispositivos ttyUSBX para administrar el hardware.

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

Sin embargo, tengo más de un dispositivo serie USB y quiero saber qué ttyUSB es para qué USBID. Ex. / dev / ttyUSB1 -> 19d2: 0031

¿Conoces algún punto donde pueda obtener esta información?


Si conoce detalles como proveedor / producto, entonces esta respuesta es excelente
earcam

Respuestas:


12

Echa un vistazo al sistema de archivos sysfs. Un ejemplo para mi serie 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

Como puede ver, los ttyUSB0mapas 067b:2303en mi computadora. Otros lugares que vale la pena explorar son /sys/class/tty/. Presta atención a los enlaces simbólicos.


¿Hiciste algo para incluirlo también en el PRODUCTO?
Igor Stoppa

@IgorStoppa, intente con catel ueventarchivo a partir del resultado de find /sys -name ttyACM0, por ejemplo. Sustituya el nombre del nodo de su dispositivo serie.
sherrellbc

9

Puede intentar ver si sus dispositivos están registrados en / dev / serial / by-id /

ls -l / dev / serial / by-id

Estos nombres deben ser consistentes y apuntarán (enlace simbólico) al ttyUSBx correcto


¿Puede agregar algunas aclaraciones, ejemplos, etc. La respuesta de Oneline no cuenta como buena en SE
Romeo Ninov

@RomeoNinov Ok, agregué algunas aclaraciones como lo solicitó. Esto no es exactamente más difícil que simplemente buscar en otro directorio, por lo que no puedo ver cómo hacer que la respuesta sea más elaborada de lo que es mejorará algo. Lo siento por eso.
Waxhead

Tengo dos adaptadores idénticos (dos Arduinos) conectados a una Raspberry Pi. ls -l /dev/serial/by-idsolo devuelve un adaptador ../../ttyUSB1, mientras que ls -l /sys/bus/usb-serial/devicesme muestra ambos. Así que no creo que esta sea una buena respuesta.
Daniel F

6

Yo tenía un problema similar .

Escriba esto a /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"

hasta el final. Reiniciar.

Ahora puede usar /dev/ONDApara llegar a su dispositivo ONDA.

Si desea que los usuarios no root puedan usarlos, agregue

, MODE="0666"

hasta el final de cada línea.


Hice esto y verifiqué los archivos a los que enlazan. El producto que tengo tiene múltiples interfaces, como disco sólido, serie USB. Si bien esperaba el enlace a / dev / ttyACM0 pero era a / dev / sda. ¿alguna forma de definir en el archivo de reglas qué tipo de dispositivo debe aplicar la regla? Escribí las reglas en /etc/udev/rules.d/99-ftdi.rules
nurp

ok lo encontró: se agregó SUBSYSTEM == "tty" a los parámetros de la regla. Este valor se puede encontrar en la salida de udevadm info --name=/dev/ttyACM0
nurp

3

Usaría udev y escribiría algunas reglas que crean enlaces simbólicos para los dispositivos.

Para obtener suficiente información para distinguir los dispositivos, intente algo como esto para todos los dispositivos:

$ udevadm info --query all --name /dev/ttyUSB0 --attribute-walk

1

Los siguientes comandos me darán una lista de nombres de dispositivos ttyUSB que están asociados con 19d2: 0016 (que es la identificación del "modo de módem" de un dispositivo ZTE MF831 LTE, el suyo puede diferir):

    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

Esto recorrerá una lista de archivos con el nombre de archivo ttyUSB *, incluidos los enlaces simbólicos, en / sys / bus / usb / devices. Dentro de los resultados buscaremos un archivo llamado modalias y buscaremos una cadena que contenga la identificación del proveedor "v" "19d2" y la identificación del producto "p" 0016. Si la salida coincide, haremos eco de una cadena con el prefijo "/ dev / "delante del USB? nombre. Afaik, el primero o generalmente el último (número más alto) es el puerto de módem para dispositivos ZTE. Puede hacer eco de los resultados en un archivo en / tmp / y head -n1 o tail -n1 las líneas en consecuencia. Si tiene centros, es probable que necesite aumentar la profundidad máxima.

Esta no es la forma más elegante, pero funcionará en casi cualquier variante de Linux.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.