Как сопоставить устройство ttyUSBX с последовательным USB-устройством


21

Опциональный драйвер правильно соответствует USB ID и загружает драйвер для этого устройства. Например

# lsusb
Bus 001 Device 002: ID 19d2:0031 ONDA Communication S.p.A. ZTE MF636
Bus 001 Device 003: ID 12d1:14ac Huawei Technologies Co., Ltd.

Он также создает устройства ttyUSBX для управления оборудованием.

crw-rw---- 1 root uucp 188, 0 Jul  4 13:48 /dev/ttyUSB0
crw-rw---- 1 root uucp 188, 1 Jul  4 13:49 /dev/ttyUSB1
crw-rw---- 1 root uucp 188, 2 Jul  4 13:35 /dev/ttyUSB2
crw-rw---- 1 root uucp 188, 3 Jul  4 13:37 /dev/ttyUSB3
crw-rw---- 1 root uucp 188, 4 Jul  4 13:37 /dev/ttyUSB4
crw-rw---- 1 root uucp 188, 5 Jul  4 13:37 /dev/ttyUSB5
crw-rw---- 1 root uucp 188, 6 Jul  4 13:37 /dev/ttyUSB6
crw-rw---- 1 root uucp 188, 7 Jul  4 13:37 /dev/ttyUSB7

Однако у меня есть более одного последовательного USB-устройства, и я хочу знать, какой ttyUSB для какого USBID. Ex. / dev / ttyUSB1 -> 19d2: 0031

Знаете ли вы, где я могу получить эту информацию?


Если вам известны такие детали, как информация о продавце / продукте, то этот ответ великолепен
earcam

Ответы:


12

Посмотрите на файловую систему sysfs. Пример для моего серийного USB:

$ lsusb
Bus 003 Device 016: ID 067b:2303 Prolific Technology, Inc. PL2303 Serial Port
$ ls -l /sys/bus/usb-serial/devices
lrwxrwxrwx 1 root root 0 Jul  4 17:37 ttyUSB0 -> ../../../devices/pci0000:00/0000:00:1c.0/0000:02:00.0/usb3/3-1/3-1:1.0/ttyUSB0
$ $ grep PRODUCT= /sys/bus/usb-serial/devices/ttyUSB0/../uevent
PRODUCT=67b/2303/300

Как видите, ttyUSB0карты 067b:2303на моем компьютере. В других местах стоит изучить это /sys/class/tty/. Обратите внимание на символические ссылки.


Вы сделали что-нибудь, чтобы включить в него также ПРОДУКТ?
Игорь Стоппа

@IgorStoppa, попробуйте catв ueventфайл из результата find /sys -name ttyACM0, например. Подставьте имя вашего последовательного устройства.
sherrellbc

9

Вы можете попытаться проверить, зарегистрированы ли ваши устройства в каталоге / dev / serial / by-id /.

ls -l / dev / serial / by-id

Эти имена должны быть согласованы и будут указывать (символическая ссылка) на правильный ttyUSBx


Можете ли вы добавить некоторые пояснения, примеры и т. Д. Ответ Oneline не считается хорошим в SE
Ромео Нинов

@RomeoNinov Хорошо, я добавил некоторые разъяснения по вашему запросу. Это не намного сложнее, чем просто заглянуть в другой каталог, поэтому я не вижу, как сделать ответ более сложным, чем он, что-нибудь изменит. Прости за это.
Waxhead

У меня есть два идентичных адаптера (два Arduinos), подключенных к Raspberry Pi. ls -l /dev/serial/by-idвозвращает только один адаптер ../../ttyUSB1, пока ls -l /sys/bus/usb-serial/devicesпоказывает мне оба. Поэтому я не думаю, что это хороший ответ.
Даниэль Ф

6

У меня была похожая проблема .

Напишите это /etc/udev/rules.d/50-usb.rules

SUBSYSTEM=="tty", ATTRS{idVendor}=="19d2", ATTRS{idProduct}=="0031", SYMLINK+="ONDA"
SUBSYSTEM=="tty", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14ac", SYMLINK+="HUAWEI"

к концу. Перезагрузка.

Теперь вы можете использовать, /dev/ONDAчтобы добраться до устройства ONDA.

Если вы хотите, чтобы пользователи без полномочий root могли использовать их, добавьте

, MODE="0666"

до конца каждой строки.


Я сделал это и проверил файлы, на которые они ссылаются. продукт, который у меня есть, имеет несколько интерфейсов, таких как твердотельный диск, последовательный порт USB. Хотя я ожидал связи с / dev / ttyACM0, но это было с / dev / sda. Любой способ определить в файле правил, какой тип устройства должно применяться правило? Я написал правила в /etc/udev/rules.d/99-ftdi.rules
nurp

хорошо нашел его: добавил SUBSYSTEM == "tty" к параметрам правила. это значение можно найти в выходных данных udevadm info --name=/dev/ttyACM0
nurp

3

Я бы использовал udev и написал несколько правил, которые создают символические ссылки для устройств.

Чтобы получить достаточно информации, чтобы различать устройства, попробуйте что-то подобное для всех устройств:

$ udevadm info --query all --name /dev/ttyUSB0 --attribute-walk

1

Следующие команды предоставят мне список имен устройств ttyUSB, связанных с 19d2: 0016 (который является идентификатором «modem mode» для ZTE MF831 LTE-флешки, ваши могут отличаться.):

    for i in $(find -L /sys/bus/usb/devices/ -maxdepth 2 -name "ttyUSB*"); do
        egrep -i "v19d2p0016(.*)in02" $i/../modalias >/dev/null && echo "/dev/${i##*/}"
    done

Это перебирает список файлов с именем ttyUSB *, включая символические ссылки, в / sys / bus / usb / devices. В результатах мы будем искать файл с именем modalias и искать строку, содержащую идентификатор поставщика "v" "19d2" и идентификатор продукта "p" 0016. Если выходные данные совпадают, мы выведем строку с префиксом "/ dev / "перед USB? имя. Первый или обычно последний (самый высокий номер) Afaik - это порт модема для устройств ZTE. Вы можете отобразить результаты в файл в / tmp / и заголовок -n1 или tail -n1 строки соответственно. Если у вас есть концентраторы, возможно, вам придется увеличить maxdepth.

Это не самый элегантный способ, но он будет работать практически на любом варианте Linux.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.