Ich verwende eine Reihe identischer USB-zu-Seriell-Adapter für meinen Laptop (Ubuntu 9.10). Die Adapter werden von Sabrent hergestellt und sind um einen Prolific PL2303 IC gebaut, wie dargestellt durch 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
Keines der von angezeigten Attribute udevadm
scheint für einen bestimmten Adapter eindeutig zu sein:
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>
Alle Adapter werden an einen einzelnen USB-Hub angeschlossen. Da ich nicht zwischen den Adaptern selbst unterscheiden kann, gibt es eine Möglichkeit, eine udev-Regel zu schreiben, die den Namen jedes Adapters basierend auf dem physischen Port des Hubs festlegt, an den der Adapter angeschlossen ist.
quelle
Obwohl dies in diesem speziellen Fall nicht helfen würde, werden einigen Adaptern eindeutige Seriennummern zugewiesen:
Eine beispielhafte Seriennummer des Adapters:
und udev Regeln würden dann enthalten:
Quelle
quelle
Haben Sie sich den Inhalt von angesehen
/dev/serial/by-id/
? In einer ähnlichen Situation wurde jedem Gerät eine eindeutige persistente ID zugewiesen (ich gebe zu, ich weiß nicht, was es tatsächlich darstellt).quelle
<VENDOR><delimeter><MODEL><delimeter><SERIAL>
Da die ursprüngliche Frage vor 3 Jahren gestellt wurde, richtet sich diese möglicherweise nicht an den Fragesteller, aber ich werde sie zur späteren Bezugnahme veröffentlichen.
Es gibt eine Möglichkeit, die Seriennummer neu zu programmieren, indem auf das EEPROM der FTDI-Chips zugegriffen wird. Silicon Labs bietet ein Tool an, das jedoch nur unter Windows ausgeführt wird:
Produktseite -> Tools-> Fixed Function Customization Utility
Direkte Verbindung
Eine Anleitung finden Sie bei remotehq:
http://remoteqth.com/wiki/index.php?page=How+to+set+usb+device+SerialNumber
Es gibt auch eine Unix-Bibliothek auf Sourceforge. Es wurde nur mit CP2101 / CP2102 / CP2103 getestet und ich habe es nicht persönlich ausprobiert.
http://sourceforge.net/projects/cp210x-program/
quelle
Verwenden Sie eine Antwort anstelle eines Kommentars, da ich eine Formatierung benötige.
Ich hatte dieses Problem und es kann leicht mit einem kleinen C-Programm behoben werden, um den Text von% devpath oder ein anderes USB-Attribut Ihrer Wahl zu manipulieren.
Dann rufen Sie das Programm folgendermaßen auf:
Dabei ist multiusbserial-id das kompilierte C-Programm.
Das Programm muss nur Text nach einem bestimmten Punkt drucken, damit es nicht komplex ist
Ich habe einen Blog-Artikel mit mehr Details geschrieben. Dies ist Teil einer Reihe von Schritten zum Einrichten einer Team-Programmierumgebung für eingebettete Systeme.
quelle
Sie können die seriellen USB-Geräte wie folgt auflisten
Die beiden Zeilen enden mit
Dies ist auf einem Himbeer-Pi. Jetzt lasse ich das Gerät
ttyUSB1
angeschlossen, ziehe den Adapter herausttyUSB0
und schließe ihn an einen anderen Port an, dann an einen anderen und dann wieder an den ursprünglichen PortIch weiß nicht, warum
1-1.3:1.0
beim Trennen der Verbindung nicht aufgeräumt wird, aber ich kann damit leben, da ich selten die Adapter von einem USB-Anschluss auf einen anderen wechsle.Mein Problem war, dass auf einem Himbeer-Pi, der die Verschlussrelais über ein per USB-Kabel angeschlossenes Arduino steuert und Umgebungssensordaten über ein anderes Arduino (gleicher Hersteller, gleiches Modell) liest, gelegentlich, wenn die Verschlüsse aktiviert wurden, die Sensordaten Arduino gekickt wurden vom Board entfernt und von ttyUSB0 zu ttyUSB2 neu zugewiesen (ttyUSB1 ist der Shutter). Ich endete mit diesem Python-Skript, um nicht durch Ausprobieren herausfinden zu müssen, auf welchem Gerät sich die Sensordaten jetzt befanden.
Das gibt mir die folgende Ausgabe
Ich führe diese Überprüfung nur durch, wenn Zeitüberschreitungen aufgrund eines Verbindungsfehlers auftreten.
quelle