Używam wielu identycznych adapterów USB-szeregowych z moim laptopem (Ubuntu 9.10). Adaptery są produkowane przez Sabrent i są zbudowane wokół układu scalonego Prolific PL2303, jak pokazano 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
Żaden z wyświetlanych atrybutów nie udevadm
wydaje się być unikalny dla konkretnego adaptera:
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>
Wszystkie adaptery są podłączone do jednego koncentratora USB. Ponieważ nie mogę rozróżnić samych adapterów, czy jest jakiś sposób, aby napisać regułę udev, która naprawia nazwę każdego adaptera w oparciu o port fizyczny w koncentratorze, do którego podłączony jest adapter?
źródło
Chociaż nie pomogłoby to w tym konkretnym przypadku, niektórym adapterom przypisano unikalne identyfikatory szeregowe:
Przykładowy identyfikator seryjny adaptera:
a reguły udev zawierałyby wówczas:
Źródło
źródło
Czy spojrzałeś na zawartość
/dev/serial/by-id/
? W podobnej sytuacji każdemu urządzeniu przypisano niepowtarzalny trwały identyfikator (przyznam, że nie wiem, co to właściwie reprezentuje).źródło
<VENDOR><delimeter><MODEL><delimeter><SERIAL>
Ponieważ pierwotne pytanie zostało zadane 3 lata temu, może to nie dotyczyć pytającego, ale opublikuję je do wglądu w przyszłości.
Istnieje sposób przeprogramowania numeru seryjnego poprzez dostęp do pamięci EEPROM układów FTDI, Silicon labs zapewnia narzędzie, ale jest to tylko system Windows:
Strona produktu -> Narzędzia-> Narzędzie dostosowywania stałej funkcji
Link bezpośredni
Instrukcja znajduje się na remotehq:
http://remoteqth.com/wiki/index.php?page=How+to+set+usb+device+SerialNumber
Istnieje również biblioteka Unix na Sourceforge. Jest testowany tylko z CP2101 / CP2102 / CP2103 i nie wypróbowałem go osobiście.
http://sourceforge.net/projects/cp210x-program/
źródło
Używam odpowiedzi zamiast komentarza, ponieważ potrzebuję formatowania.
Miałem ten problem i można go łatwo naprawić za pomocą małego programu C do manipulowania tekstem% devpath lub innym wybranym atrybutem USB.
Następnie wywołujesz ten program w następujący sposób:
gdzie multiusbserial-id to skompilowany program C.
Program musi po prostu wydrukować tekst po określonym punkcie, więc nie jest skomplikowany
Napisałem artykuł na blogu z dalszymi szczegółami. Jest to jedna z serii konfiguracji środowiska programistycznego zespołu systemów wbudowanych.
źródło
Możesz wymienić takie urządzenia szeregowe USB
Dwie linie kończą się na
To jest na Raspberry Pi. Teraz pozostawię urządzenie
ttyUSB1
podłączone, wyciągnę adapterttyUSB0
i podłączę go do innego portu, a następnie do innego, a następnie z powrotem do portu początkowegoNie wiem, dlaczego
1-1.3:1.0
nie usuwa się go po odłączeniu, ale mogę z tym żyć, ponieważ rzadko zmieniam adaptery z jednego portu USB na inny.Mój problem polegał na tym, że na Raspberry Pi, który steruje przekaźnikami migawki za pomocą Arduino podłączonego kablem USB i odczytuje dane czujnika otoczenia przez innego Arduino (ten sam producent, ten sam model), czasami, gdy aktywowane są migawki, dane czujnika Arduino zostały wykopane poza planszą i ponownie przypisany z ttyUSB0 do ttyUSB2 (ttyUSB1 to migawka). Skończyło się na tym skrypcie Python, aby nie musieć próbować i sprawdzać, które urządzenie było teraz na czujniku.
co daje mi następujący wynik
Wykonuję tę kontrolę tylko wtedy, gdy występują przekroczenia limitu czasu z powodu błędu połączenia.
źródło