Utilizo varios adaptadores USB a serie idénticos con mi computadora portátil (Ubuntu 9.10). Los adaptadores son fabricados por Sabrent y están construidos alrededor de un Prolific PL2303 IC, como se muestra en lsusb
:
Bus 001 Device 008: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 007: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Bus 001 Device 006: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
Ninguno de los atributos mostrados por udevadm
parece ser exclusivo de un adaptador en particular:
foo@bar:~$ udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB0
looking at device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.1/1-4.1:1.0/ttyUSB0':
KERNEL=="ttyUSB0"
SUBSYSTEM=="usb-serial"
DRIVER=="pl2303"
ATTR{port_number}=="0"
looking at parent device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.1/1-4.1:1.0':
KERNELS=="1-4.1:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="pl2303"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="03"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{modalias}=="usb:v067Bp2303d0300dc00dsc00dp00icFFisc00ip00"
ATTRS{supports_autosuspend}=="1"
looking at parent device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.1':
KERNELS=="1-4.1"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="538"
ATTRS{idVendor}=="067b"
ATTRS{idProduct}=="2303"
ATTRS{bcdDevice}=="0300"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="6"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Prolific Technology Inc."
ATTRS{product}=="USB-Serial Controller"
<snip>
foo@bar:~$ udevadm info --attribute-walk --path=/sys/bus/usb-serial/devices/ttyUSB1
looking at device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5/1-4.5:1.0/ttyUSB1':
KERNEL=="ttyUSB1"
SUBSYSTEM=="usb-serial"
DRIVER=="pl2303"
ATTR{port_number}=="0"
looking at parent device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5/1-4.5:1.0':
KERNELS=="1-4.5:1.0"
SUBSYSTEMS=="usb"
DRIVERS=="pl2303"
ATTRS{bInterfaceNumber}=="00"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bNumEndpoints}=="03"
ATTRS{bInterfaceClass}=="ff"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{modalias}=="usb:v067Bp2303d0300dc00dsc00dp00icFFisc00ip00"
ATTRS{supports_autosuspend}=="1"
looking at parent device
'/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5':
KERNELS=="1-4.5"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{configuration}==""
ATTRS{bNumInterfaces}==" 1"
ATTRS{bConfigurationValue}=="1"
ATTRS{bmAttributes}=="80"
ATTRS{bMaxPower}=="100mA"
ATTRS{urbnum}=="69"
ATTRS{idVendor}=="067b"
ATTRS{idProduct}=="2303"
ATTRS{bcdDevice}=="0300"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bNumConfigurations}=="1"
ATTRS{bMaxPacketSize0}=="64"
ATTRS{speed}=="12"
ATTRS{busnum}=="1"
ATTRS{devnum}=="7"
ATTRS{version}==" 1.10"
ATTRS{maxchild}=="0"
ATTRS{quirks}=="0x0"
ATTRS{authorized}=="1"
ATTRS{manufacturer}=="Prolific Technology Inc."
ATTRS{product}=="USB-Serial Controller"
<snip>
Todos los adaptadores están conectados a un solo concentrador USB. Dado que no puedo distinguir entre los adaptadores, ¿hay alguna forma de escribir una regla udev que corrija el nombre de cada adaptador según el puerto físico en el que está conectado el adaptador?
fuente
Aunque no ayudaría en este caso específico, algunos adaptadores tienen identificadores de serie únicos:
Un ejemplo de id. De serie del adaptador:
y las reglas de udev contendrían entonces:
Fuente
fuente
¿Has mirado el contenido de
/dev/serial/by-id/
? En una situación similar, a cada dispositivo se le asignó una identificación persistente única allí (admito que no sé lo que realmente representa).fuente
<VENDOR><delimeter><MODEL><delimeter><SERIAL>
Dado que la pregunta original se hizo hace 3 años, esto podría no responder al autor de la pregunta, pero lo publicaré para referencia futura.
Hay una manera de reprogramar el número de serie accediendo a la EEPROM de los chips FTDI, Silicon labs proporciona una herramienta, pero es solo Windows:
Página del producto -> Herramientas-> Utilidad de personalización de funciones fijas
Enlace directo
Se puede encontrar una instrucción en remotehq:
http://remoteqth.com/wiki/index.php?page=How+to+set+usb+device+SerialNumber
También hay una biblioteca Unix en Sourceforge. Solo se probó con CP2101 / CP2102 / CP2103 y no lo probé personalmente.
http://sourceforge.net/projects/cp210x-program/
fuente
Usando una respuesta en lugar de un comentario ya que necesito formatear.
Tuve este problema y se soluciona fácilmente usando un pequeño programa en C para manipular el texto de% devpath o algún otro atributo USB de su elección.
Luego llama a ese programa así:
donde multiusbserial-id es el programa C compilado.
El programa solo necesita imprimir texto después de un punto en particular, por lo que no es complejo
Escribí un artículo de blog con más detalles. Es una de una serie en la configuración de un entorno de programación de equipo de sistemas integrados.
fuente
Puede enumerar los dispositivos serie USB como este
Las dos líneas terminan con
Esto está en una Raspberry Pi. Ahora dejaré el dispositivo
ttyUSB1
conectado, sacaré el adaptadorttyUSB0
y lo enchufaré a otro puerto, luego a otro y luego de vuelta al puerto inicialNo sé por qué
1-1.3:1.0
no se limpia después de la desconexión, pero puedo vivir con eso, ya que rara vez cambio los adaptadores de un puerto USB a otro.Mi problema fue que en una Raspberry Pi que controla los obturadores a través de un Arduino conectado a través de un cable USB y lee los datos del sensor de entorno a través de otro Arduino (mismo fabricante, mismo modelo), ocasionalmente, cuando se activaron los obturadores, los datos del sensor Arduino fueron pateados fuera del tablero y reasignado de ttyUSB0 a ttyUSB2 (ttyUSB1 es el obturador). Terminé con este script de Python para no tener que averiguar por prueba y error en qué dispositivo estaban ahora los datos del sensor.
lo que me da el siguiente resultado
Solo realizo esta comprobación cuando se producen tiempos de espera debido a un error de conexión.
fuente