Согласованное перечисление устройств Linux

13

В нашей коробке Linux у нас есть USB -> последовательное устройство, которое всегда обозначалось как /dev/ttyACM0. Поэтому я написал заявление и до вчерашнего дня все работало нормально. Но вдруг (да, во время удаленной презентации ...) устройство перестало работать. После быстрого исследования я обнаружил, что связь изменилась на /dev/ttyACM1. Это было немного несвоевременно, но теперь у меня проблема - как однозначно идентифицировать мое устройство? Как, например, накопитель может быть инициализирован с использованием UUID, хотя /dev/sd**он изменился. Есть ли способ сделать это для последовательных устройств?

Теперь я использую тупой обходной путь:

for(int i = 0; i < 10; i ++)
{
    m_port = std::string("/dev/ttyACM") + (char)('0' + i);
    m_fd = open(m_port.c_str(), O_RDWR | O_NOCTTY | O_NDELAY);
}

Ссылка на устройство мы используем.

folibis
источник

Ответы:

19

Поскольку мы говорим о USB-устройствах и предположим, что у вас есть udev, вы можете настроить некоторые правила udev.

Я думаю, и это просто дикая догадка, кто-то или что-то отключило / удалило устройство и снова подключило его / добавило устройство снова, что увеличивает число.

Теперь для начала вам нужны идентификаторы поставщиков и продуктов:

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 011: ID 0403:6001 FTDI FT232 USB-Serial (UART) IC

Далее вам нужен серийный номер (если у вас их несколько):

# udevadm info -a -n /dev/ttyUSB1 | grep '{serial}' | head -n1
    ATTRS{serial}=="A6008isP"

Теперь давайте создадим правило udev:

Правила UDEV обычно разбросаны по многим файлам в /etc/udev/rules.d. Создайте новый файл с именем 99-usb-serial.rulesи поместите туда следующую строку, у меня есть три устройства, каждое из которых имеет свой серийный номер:

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A6008isP", SYMLINK+="MySerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="A7004IXj", SYMLINK+="MyOtherSerialDevice"
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", ATTRS{serial}=="FTDIF46B", SYMLINK+="YetAnotherSerialDevice"

ls -l /dev/MySerialDevice
lrwxrwxrwx 1 root root 7 Nov 25 22:12 /dev/MySerialDevice -> ttyUSB1

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

SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6001", SYMLINK+="MySerialDevice"

Взято отсюда

thecarpy
источник
3
Если у вас есть недавний дистрибутив Linux, скорее всего, он уже автоматически создает устройство как /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0. Это может быть достаточно для вас без пользовательских правил udev.
Иосиф говорит восстановить Монику
1
К сожалению, многие безымянные устройства имеют серийный номер «0123456789abcdef». Вот где это становится интересным.
Мосви
@mosvy серийные номера неизменны?
OganM
@OganM они могут быть изменены ... если вы можете рутировать устройства.
Мосви