Как отличить идентичные USB-последовательные адаптеры?

Я использую несколько идентичных USB-последовательных адаптеров с моим ноутбуком (Ubuntu 9.10). Адаптеры изготовлены Sabrent и построены вокруг Prolific 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, кажется уникальным для конкретного адаптера:

[email protected]:~$ 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>

 [email protected]:~$ 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, которое фиксирует имя каждого адаптера на основе того, какой физический порт на концентраторе подключен к адаптеру?

22 голоса | спросил Chris OBrien 21 J0000006Europe/Moscow 2011, 22:39:48

6 ответов


18
  

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

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

  

просмотр родительского устройства   '/Devices/pci0000:00/0000:00:1d.7/usb1/1-4/1-4.5':   KERNELS == "1-4,5"
  SUBSYSTEMS == "USB"
  DRIVERS == "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 {version} == "   1.10 "ATTRS {maxchild} ==" 0 "ATTRS {quirks} ==" 0x0 "
  ATTRS {разрешено} == "1"
  ATTRS {производитель} == "Prolific   Technology Inc. "
  ATTRS {продукт} == "USB-Serial   Контроллер "

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

  

KERNEL == "ttyUSB *", KERNELS == "1-8.1.5", NAME = "ttyUSB0"
  KERNEL == "ttyUSB *", KERNELS == "1-8.1.6", NAME = "ttyUSB1"
  KERNEL == "ttyUSB *", KERNELS == "1-8.1.1", NAME = "ttyUSB2"
  KERNEL == "ttyUSB *", KERNELS == "1-8.1.2", NAME = "ttyUSB3"

Эти правила имеют один очевидный недостаток: они предполагают, что все преобразователи USB-to-serial будут подключены к одному концентратору («1-8.1. *»). Если USB-последовательный преобразователь был подключен к другому USB-порту, ему может быть присвоено имя «ttyUSB0», которое противоречит схеме именования, описанной выше. Однако, поскольку я оставляю все конвертеры подключенными к концентратору, я могу жить с этим ограничением.

ответил Chris OBrien 24 J0000006Europe/Moscow 2011, 22:55:10
13

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

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"

Источник

ответил Cas 19 J000000Thursday12 2012, 00:57:40
7

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

ответил Rob Tirrell 20 J0000006Europe/Moscow 2012, 03:59:56
3

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

Существует способ перепрограммировать серийный номер путем доступа к EEPROM FTDI-Chips, Silicon labs предоставляет инструмент, но это только Windows:

Страница продукта -> , Tools> Утилита настройки фиксированной функции

Прямая ссылка

Инструкция можно найти в файле remotehq:

http://remoteqth.com/вики /index.php? страница = как + набор + USB + устройство + SerialNumber

В Sourceforge также есть библиотека Unix. Он тестируется только с CP2101 /CP2102 /CP2103, и я лично не пробовал его.

http://sourceforge.net/projects/cp210x-program/

ответил Smundo 7 52014vEurope/Moscow11bEurope/MoscowFri, 07 Nov 2014 11:22:45 +0300 2014, 11:22:45
0

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

  

Эти правила имеют один очевидный недостаток: они предполагают, что все преобразователи USB-to-serial будут подключены к одному концентратору («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-id - это скомпилированная программа 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;
}

Я написал более подробную информацию о статье в блоге . Это одна из серии в создании среды программирования встраиваемых систем.

ответил vk5tu 14 PMpFri, 14 Apr 2017 16:22:10 +030022Friday 2017, 16:22:10
0

Вы можете перечислить последовательные устройства 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

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

 введите описание изображения здесь>> </a> </p>

<pre><code>---- +: = 4 = + ----</code></pre>

<p> Я не знаю, почему <code>---- +: = 5 =: + ----</code> не очищается при отключении, но я могу жить с этим, так как я редко измените адаптеры с одного порта USB на другой. </p>

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

<pre><code>---- +: = 6 = + ----</code></pre>

<p>, который дает мне следующий выход </p>

<pre><code>---- +: = 7 = + ----</code></pre>

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

ответил Daniel F 9 +03002018-10-09T10:59:13+03:00312018bEurope/MoscowTue, 09 Oct 2018 10:59:13 +0300 2018, 10:59:13

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132