J'utilise un certain nombre d'adaptateurs USB-série identiques avec mon ordinateur portable (Ubuntu 9.10). Les adaptateurs sont fabriqués par Sabrent et sont construits autour d'un circuit intégré Prolific PL2303, comme illustré par 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
Aucun des attributs affichés par ne udevadm
semble être unique pour un adaptateur particulier:
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>
Tous les adaptateurs sont branchés sur un seul concentrateur USB. Étant donné que je ne peux pas distinguer les adaptateurs eux-mêmes, existe-t-il un moyen d'écrire une règle udev qui fixe le nom de chaque adaptateur en fonction du port physique sur le concentrateur auquel l'adaptateur est branché?
la source
Bien que cela ne soit d'aucune utilité dans ce cas spécifique, certains adaptateurs se voient attribuer des ID série uniques:
Un exemple d'ID série d'adaptateur:
et les règles udev contiendraient alors:
La source
la source
Avez-vous regardé le contenu de
/dev/serial/by-id/
? Dans une situation similaire, chaque appareil s'est vu attribuer un ID persistant unique (j'avoue ne pas savoir ce qu'il représente réellement).la source
<VENDOR><delimeter><MODEL><delimeter><SERIAL>
Étant donné que la question d'origine a été posée il y a 3 ans, cela pourrait ne pas s'adresser au demandeur, mais je la posterai pour référence future.
Il existe un moyen de reprogrammer le numéro de série en accédant à l'EEPROM des puces FTDI, Silicon labs fournit un outil, mais c'est uniquement Windows:
Page produit -> Outils-> Utilitaire de personnalisation des fonctions fixes
Lien direct
Une instruction peut être trouvée sur remotehq:
http://remoteqth.com/wiki/index.php?page=How+to+set+usb+device+SerialNumber
Il existe également une bibliothèque Unix sur Sourceforge. Il n'est testé qu'avec CP2101 / CP2102 / CP2103 et je ne l'ai pas essayé personnellement.
http://sourceforge.net/projects/cp210x-program/
la source
Utiliser une réponse plutôt qu'un commentaire car j'ai besoin d'une mise en forme.
J'ai eu ce problème et il est facilement résolu en utilisant un petit programme C pour manipuler le texte de% devpath ou un autre attribut USB de votre choix.
Vous appelez ensuite ce programme comme ceci:
où multiusbserial-id est le programme C compilé.
Le programme a juste besoin d'imprimer du texte après un point particulier, donc ce n'est pas complexe
J'ai écrit un article de blog avec plus de détails. Il fait partie d'une série de mise en place d'un environnement de programmation d'équipe de systèmes embarqués.
la source
Vous pouvez répertorier les périphériques série USB comme celui-ci
Les deux lignes se terminent par
C'est sur un Raspberry Pi. Je vais maintenant laisser l'appareil
ttyUSB1
connecté, retirer l'adaptateurttyUSB0
et le brancher sur un autre port, puis un autre, puis de nouveau sur le port initialJe ne sais pas pourquoi
1-1.3:1.0
ne se nettoie pas lors de la déconnexion, mais je peux vivre avec cela, car je change rarement les adaptateurs d'un port USB à un autre.Mon problème était que sur un Raspberry Pi qui contrôle les relais de l'obturateur via un Arduino connecté via un câble USB et lit les données du capteur d'environnement via un autre Arduino (même fabricant, même modèle), parfois, lorsque les volets ont été activés, les données du capteur Arduino se sont déclenchées hors de la carte et réaffecté de ttyUSB0 à ttyUSB2 (ttyUSB1 est l'obturateur). Je me suis retrouvé avec ce script Python pour ne pas avoir à découvrir par essais et erreurs sur quel appareil les données du capteur étaient maintenant.
ce qui me donne la sortie suivante
J'effectue cette vérification uniquement lorsque des délais d'attente dus à une erreur de connexion se produisent.
la source