Послідовне перерахування пристроїв 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);
}

Посилання на пристрій ми використовуємо.

Відповіді:


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"

Взято звідси


3
Якщо у вас недавній дистрибутив Linux, швидше за все, він вже автоматично створює пристрій як /dev/serial/by-id/usb-XXXX_USB2.0-Serial-if00-port0. Це може бути достатньо для вас без спеціальних правил udev.
Йозеф каже, що

1
На жаль, багато пристроїв без імені мають серійний номер "0123456789abcdef". Ось де стає цікаво.
mosvy

@mosvy - це серійні номери незмінні?
OganM

@OganM вони можуть бути змінені ... якщо ви зможете викорінити пристрої.
mosvy
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.