Я использую несколько идентичных адаптеров USB-to-serial с моим ноутбуком (Ubuntu 9.10). Адаптеры изготовлены Sabrent и построены вокруг ИС Prolific PL2303, как показано 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
udevadm
Похоже, что ни один из отображаемых атрибутов не является уникальным для конкретного адаптера:
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>
Все адаптеры подключены к одному USB-концентратору. Поскольку я не могу различить сами адаптеры, можно ли как-нибудь написать правило udev, которое фиксирует имя каждого адаптера в зависимости от того, к какому физическому порту на концентраторе подключен адаптер?
источник
Хотя это не поможет в этом конкретном случае, некоторым адаптерам назначаются уникальные серийные идентификаторы:
Пример серийного идентификатора адаптера:
и тогда правила udev будут содержать:
Источник
источник
Вы смотрели на содержание
/dev/serial/by-id/
? В аналогичной ситуации каждому устройству был присвоен уникальный постоянный идентификатор (я признаю, что не знаю, что оно на самом деле представляет).источник
<VENDOR><delimeter><MODEL><delimeter><SERIAL>
Поскольку первоначальный вопрос был задан 3 года назад, он может не задаться вопросом, но я опубликую его для дальнейшего использования.
Существует способ перепрограммировать серийный номер путем доступа к EEPROM микросхем FTDI, Silicon Labs предоставляет инструмент, но только для Windows:
Страница продукта -> Инструменты-> Утилита настройки фиксированных функций
Прямая ссылка
Инструкцию можно найти на remotehq:
http://remoteqth.com/wiki/index.php?page=How+to+set+usb+device+SerialNumber
Существует также библиотека Unix на Sourceforge. Это только проверено с CP2101 / CP2102 / CP2103, и я не пробовал это лично.
http://sourceforge.net/projects/cp210x-program/
источник
Использование ответа, а не комментария, так как мне нужно форматирование.
У меня была эта проблема, и ее легко устранить, используя небольшую программу на C для манипулирования текстом% devpath или каким-либо другим USB-атрибутом по вашему выбору.
Затем вы вызываете эту программу так:
где multiusbserial-id - это скомпилированная Си-программа.
Программа просто должна печатать текст после определенного момента, чтобы он не был сложным
Я написал статью в блоге с более подробной информацией. Это один из серии по настройке среды командного программирования для встраиваемых систем.
источник
Вы можете перечислить последовательные устройства USB, как это
Две строки заканчиваются на
Это на Raspberry Pi. Теперь я оставлю устройство
ttyUSB1
подключенным, вытащу адаптерttyUSB0
и подключу его к другому порту, затем к другому, а затем обратно к начальному порту.Я не знаю, почему
1-1.3:1.0
не очищается при отключении, но я могу с этим смириться, поскольку я редко меняю адаптеры с одного USB-порта на другой.Моя проблема заключалась в том, что на Raspberry Pi, который управляет реле затвора через Arduino, подключенный через USB-кабель, и считывает данные датчика окружающей среды через другое Arduino (того же производителя, той же модели), иногда, когда активируются затворы, данные датчика Arduino вышибаются выключен и переназначен с ttyUSB0 на ttyUSB2 (ttyUSB1 - затвор). Я закончил с этим скриптом Python, чтобы не пришлось методом проб и ошибок выяснять, на каком устройстве теперь были данные датчика.
что дает мне следующий вывод
Я выполняю эту проверку только тогда, когда происходят тайм-ауты из-за ошибки соединения.
источник