Eu uso vários adaptadores USB-serial idênticos com o meu laptop (Ubuntu 9.10). Os adaptadores são fabricados pela Sabrent e são construídos em torno de um Prolific PL2303 IC, conforme mostrado por 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
Nenhum dos atributos exibidos por udevadm
parece ser exclusivo para um adaptador específico:
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 os adaptadores estão conectados a um único hub USB. Como não posso distinguir entre os adaptadores, existe alguma maneira de escrever uma regra do udev que corrige o nome de cada adaptador com base na porta física do hub em que o adaptador está conectado?
fonte
Embora não ajude nesse caso específico, alguns adaptadores recebem IDs de série exclusivos:
Um exemplo de identificação serial do adaptador:
e as regras do udev conteriam:
Fonte
fonte
Você já olhou o conteúdo de
/dev/serial/by-id/
? Em uma situação semelhante, a cada dispositivo foi atribuído um ID persistente exclusivo lá (eu admito que não sei o que ele realmente representa).fonte
<VENDOR><delimeter><MODEL><delimeter><SERIAL>
Como a pergunta original foi feita há 3 anos, isso talvez não atenda ao solicitante, mas eu a publicarei para referência futura.
Existe uma maneira de reprogramar o número de série acessando a EEPROM dos chips FTDI, o Silicon labs fornece uma ferramenta, mas é apenas o Windows:
Página do produto -> Ferramentas-> Utilitário de Customização de Função Fixa
Link direto
Uma instrução pode ser encontrada em remotehq:
http://remoteqth.com/wiki/index.php?page=How+to+set+usb+device+SerialNumber
Há também uma biblioteca Unix no Sourceforge. Ele foi testado apenas com o CP2101 / CP2102 / CP2103 e eu não o testei pessoalmente.
http://sourceforge.net/projects/cp210x-program/
fonte
Usando uma resposta em vez de um comentário, pois preciso de formatação.
Eu tive esse problema e é facilmente corrigido usando um pequeno programa C para manipular o texto de% devpath ou algum outro atributo USB de sua escolha.
Você chama esse programa assim:
onde multiusbserial-id é o programa C compilado.
O programa só precisa imprimir texto após um determinado ponto, para que não seja complexo
Eu escrevi um artigo de blog com mais detalhes. É uma de uma série na configuração de um ambiente de programação de equipe de sistemas embarcados.
fonte
Você pode listar os dispositivos seriais USB como este
As duas linhas estão terminando com
Isso é em um Raspberry Pi. Vou agora deixar o dispositivo
ttyUSB1
conectado, puxar o adaptadorttyUSB0
e conectá-lo a outra porta, depois a outra e depois voltar à porta inicialNão sei por que não estou
1-1.3:1.0
sendo limpo após a desconexão, mas posso conviver com isso, pois raramente troco os adaptadores de uma porta USB para outra.Meu problema era que, em um Raspberry Pi que controla os relés do obturador por meio de um Arduino conectado via cabo USB e lê os dados do sensor do ambiente por outro Arduino (mesmo fabricante, mesmo modelo), ocasionalmente, quando as persianas eram ativadas, os dados do sensor do Arduino eram chutados. fora da placa e transferido de ttyUSB0 para ttyUSB2 (ttyUSB1 é o obturador). Eu terminei com este script Python para não precisar descobrir por tentativa e erro em qual dispositivo os dados do sensor estavam ativados.
o que me dá a seguinte saída
Realizo essa verificação apenas quando ocorrem tempos limite devido a um erro de conexão.
fonte