Как различать идентичный USB К ПОСЛЕДОВАТЕЛЬНЫМ АДАПТЕРАМ?

Я использую много идентичных USB К ПОСЛЕДОВАТЕЛЬНЫМ АДАПТЕРАМ со своим ноутбуком (Ubuntu 9.10). Адаптеры произведены Sabrent и создаются вокруг Плодовитого PL2303 IC, как показано 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, которое фиксирует название каждого адаптера, на основе которого физического порта на концентраторе включен адаптер?

26
задан 18 July 2012 в 13:34

6 ответов

есть ли какой-либо способ, которым я могу записать правило udev, которое фиксирует название каждого адаптера, на основе которого физического порта на концентраторе включен адаптер?

Да существует, как оказалось. Считайте последнюю часть иерархии устройства показанной во втором примере выше:

рассмотрение родительского устройства '/devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5': ЯДРА == "1-4.5"
ПОДСИСТЕМЫ == "usb"
ДРАЙВЕРЫ == "usb"
ATTRS {конфигурация} == ""
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 {скорость} == "12"
ATTRS {busnum} == "1"
ATTRS {devnum} == "7" ATTRS {версия} ==" 1.10" ATTRS {maxchild} == "0" ATTRS {причуды} == "0x0"
ATTRS {авторизованный} == "1"
ATTRS {производитель} == "Prolific Technology Inc".
ATTRS {продукт} == "последовательный USB контроллер"

Имя, данное этому устройству ядром (ЯДРА == "1-4.5"), указывает, что это устройство включается в пятый порт концентратора, подключенного к порту четыре на шине 1 (см. этот FAQ для получения дополнительной информации о том, как декодировать sysfs иерархию USB-устройства). С некоторой справкой от этого руководства по записи udev постановляет, что я придумал следующий набор правил udev для моих USB-to-serial-port преобразователей:

ЯДРО == "ttyUSB*", ЯДРА == "1-8.1.5", НАЗЫВАЕТ = "ttyUSB0"
ЯДРО == "ttyUSB*", ЯДРА == "1-8.1.6", НАЗЫВАЕТ = "ttyUSB1"
ЯДРО == "ttyUSB*", ЯДРА == "1-8.1.1", НАЗЫВАЕТ = "ttyUSB2"
ЯДРО == "ttyUSB*", ЯДРА == "1-8.1.2", НАЗЫВАЕТ = "ttyUSB3"

Эти правила имеют один очевидный недостаток: они предполагают, что все преобразователи USB-К-ПОСЛЕДОВАТЕЛЬНОМУ будут включены в тот же концентратор ("1-8.1.*"). Если бы USB к последовательному преобразователю был включен в другой USB-порт, то ему можно было бы присвоить имя "ttyUSB0", который конфликтовал бы со схемой именования, описанной выше. Однако, так как я уезжаю, все преобразователи включили концентратор, я могу жить с этим ограничением.

24
ответ дан 23 November 2019 в 01:07

Хотя это не помогло бы в этом конкретном случае, некоторым адаптерам присваивают уникальные последовательные идентификаторы:

udevadm info -a -n /dev/ttyUSB1 | grep '{serial}'

Адаптер в качестве примера последовательный идентификатор:

  ATTRS{serial}=="A6008isP"`

и правила udev затем содержали бы:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="arduino"

Источник

16
ответ дан 23 November 2019 в 01:07

Вы посмотрели на содержание /dev/serial/by-id/? В аналогичной ситуации каждому устройству присвоили уникальный персистентный идентификатор там (я признаю, не знают то, что оно на самом деле представляет).

7
ответ дан 23 November 2019 в 01:07

Так как исходный вопрос задали 3 года назад, это не могло бы адресовать автора вопроса, но я отправлю его для дальнейшего использования.

Существует путь к reprogramm Порядковый номер путем доступа к EEPROM FTDI-микросхем, Кремниевые лаборатории обеспечивают инструмент, но это - 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/

3
ответ дан 23 November 2019 в 01:07

Используя ответ, а не комментарий, поскольку мне нужно форматирование.

Эти правила имеют один очевидный недостаток: они предполагают, что все преобразователи USB-К-ПОСЛЕДОВАТЕЛЬНОМУ будут включены в тот же концентратор ("1-8.1.*"). Если бы USB к последовательному преобразователю был включен в другой USB-порт, то ему можно было бы присвоить имя "ttyUSB0", который конфликтовал бы со схемой именования, описанной выше. Однако, так как я уезжаю, все преобразователи включили концентратор, я могу жить с этим ограничением.

У меня была эта проблема, и она легко фиксируется при помощи маленькой программы C для управления текстом %devpath или некоторым другим атрибутом USB выбора.

Вы затем называете ту программу как это:

ACTION!="add|change", GOTO="99-local-end

SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6001", ENV{ID_MM_DEVICE_IGNORE}="1"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", GOTO="99-local-tty-ftdi"
GOTO="99-local-end"

LABEL="99-local-tty-ftdi"
IMPORT{program}="/usr/local/lib/udev/multiusbserial-id %s{devpath}"
# Hayes-style Modem
ENV{ID_MULTIUSBSERIAL_DEVNAME_MINOR}=="1", GROUP="dialout", MODE="0660", SYMLINK+="modem"
# Console for network device
ENV{ID_MULTIUSBSERIAL_DEVNAME_MINOR}=="2", GROUP="wheel", MODE="0660", SYMLINK+="ttyswitch"
# Serial port for software development
ENV{ID_MULTIUSBSERIAL_DEVNAME_MINOR}=="3", GROUP="eng", MODE="0660", SYMLINK+="ttyrouter"
# Unused
ENV{ID_MULTIUSBSERIAL_DEVNAME_MINOR}=="4", GROUP="wheel", MODE="0660"

LABEL="99-local-end"

где multiusbserial-идентификатор является скомпилированной программой C.

Программа просто должна распечатать текст после конкретной точки, таким образом, это не сложно

/* multiusbserial.c */
#include <stdio.h>
#include <stdlib.h>

#define PROGRAM_NAME "multiusbserial-id"
#define VARIABLE_PREFIX "ID_MULTIUSBSERIAL_"

int main(int argc, char *argv[])
{
  char *p;
  int found = 0;

  if (argc != 2) {
    fprintf(stderr, "Usage: " PROGRAM_NAME " ATTRS{devpath}\n");
    exit(1);
  }

  for (p = argv[1]; *p != '\0'; p++) {
    if (*p == '.') {
      p++;
      found = (*p != '\0');
      break;
    }
  }

  if (!found) {
    fprintf(stderr, PROGRAM_NAME ": unexpected format\n");
    exit(1);
  }

  printf(VARIABLE_PREFIX "DEVNAME_MINOR=%s\n", p);
  return 0;
}

Я написал статью блога с большим количеством деталей. Это - один из ряда в установке среды программирования команды встроенных систем.

1
ответ дан 23 November 2019 в 01:07

Можно перечислить последовательные устройства USB как это

ls -l /sys/bus/usb-serial/devices
total 0
lrwxrwxrwx 1 root root 0 Oct  9 09:10 ttyUSB0 -> ../../../devices/platform/soc/3f980000.usb/usb1/1-1/1-1.3/1-1.3:1.0/ttyUSB0
lrwxrwxrwx 1 root root 0 Oct  9 09:10 ttyUSB1 -> ../../../devices/platform/soc/3f980000.usb/usb1/1-1/1-1.5/1-1.5:1.0/ttyUSB1

Эти две строки заканчиваются

1-1.3:1.0/ttyUSB0
1-1.5:1.0/ttyUSB1

Это находится на Raspberry Pi. Я теперь оставлю устройство ttyUSB1 связанный, и вытаскивают адаптер ttyUSB0 и включите его в другой порт, затем другой, и затем обратно к начальному порту

enter image description here

# original setup
['1-1.3:1.0', 'ttyUSB0'] --
['1-1.5:1.0', 'ttyUSB1']

# move it to port above 1.3
['1-1.3:1.0', 'ttyUSB0']
['1-1.5:1.0', 'ttyUSB1']
['1-1.2:1.0', 'ttyUSB2'] --

# move it to port above 1.5
['1-1.3:1.0', 'ttyUSB0']
['1-1.5:1.0', 'ttyUSB1']
['1-1.4:1.0', 'ttyUSB2'] --

# move it back to the original port
['1-1.3:1.0', 'ttyUSB0'] --
['1-1.5:1.0', 'ttyUSB1']

Я не знаю почему 1-1.3:1.0 не становится очищенным после разъединения, но я могу жить с этим, так как я редко изменяю адаптеры от одного USB-порта до другого.


Моя проблема была то, что на Raspberry Pi, который управляет реле затвора через Ардуино, присоединенного через USB-кабель, и считывает данные датчика среды через другого Ардуино (тот же производитель, та же модель), иногда, когда затворы были активированы, данные датчика, Ардуино был начат плата и повторно присвоился от ttyUSB0 до ttyUSB2 (ttyUSB1, затвор). Я закончил с этим сценарием Python относительно не, должны узнать методом проб и ошибок, какое устройство данные датчика были теперь включены.

usb_devices = collections.OrderedDict()
usb_device_list = subprocess.check_output('ls -l /sys/bus/usb-serial/devices', shell=True, universal_newlines=True).split('\n')
for usb_device in usb_device_list:
  match = re.search("([^/]+)/([^/]+)$", usb_device)
  if match:
    usb_devices[match.group(1)] = match.group(2)

for key, value in usb_devices.items():
  print key, value

# I know that 1.3 is the environment sensor device
if '1-1.3:1.0' in usb_devices:
  print '1-1.3:1.0 -->', usb_devices['1-1.3:1.0'] # == ttyUSB0

который дает мне следующий вывод

1-1.3:1.0 ttyUSB0
1-1.5:1.0 ttyUSB1
1-1.3:1.0 --> ttyUSB0

Я только выполняю эту проверку, когда тайм-ауты из-за ошибки соединения происходят.

0
ответ дан 23 November 2019 в 01:07

Другие вопросы по тегам:

Похожие вопросы: