Який правильний спосіб отримати список усіх доступних послідовних портів / пристроїв в системі Linux?
Іншими словами, коли я перебираю всі пристрої в /dev/
, як я можу сказати, які з них є послідовними портами класичним способом, тобто тими, що зазвичай підтримують швидкість передачі даних та контроль потоку RTS / CTS ?
Розчин буде закодовано в С.
Я запитую, тому що я використовую сторонні бібліотеки, які роблять це явно неправильно: це, здається, лише повторюється /dev/ttyS*
. Проблема полягає в тому, що є, наприклад, послідовні порти через USB (надаються адаптерами USB-RS232), і вони перелічені у розділі / dev / ttyUSB *. І читаючи Serial-HOWTO на Linux.org , я здогадуюсь, що з часом з'являться й інші простори імен.
Тому мені потрібно знайти офіційний спосіб виявлення серійних пристроїв. Проблема полягає в тому, що жоден не видається задокументованим, або я не можу його знайти.
Я думаю, що одним із способів було б відкрити всі файли /dev/tty*
та викликати певний ioctl()
на них, який доступний лише на послідовних пристроях. Невже це буде хорошим рішенням?
Оновлення
hrickards запропонував подивитися джерело для "setserial". Його код робить саме те, що я мав на увазі:
По-перше, він відкриває пристрій з:
fd = open (path, O_RDWR | O_NONBLOCK)
Потім він викликає:
ioctl (fd, TIOCGSERIAL, &serinfo)
Якщо цей виклик не повертає помилок, мабуть, це послідовний пристрій.
Я знайшов аналогічний код у " Послідовне програмування / терміни" , який запропонував також додати O_NOCTTY
параметр.
Однак є одна проблема з таким підходом:
Коли я тестував цей код на BSD Unix (тобто Mac OS X), він також працював. Однак послідовні пристрої, що надаються через Bluetooth, змушують систему (драйвер) намагатися підключитися до пристрою Bluetooth, який проходить деякий час, перш ніж він повернеться з помилкою очікування. Це викликано просто відкриттям пристрою. І я можу собі уявити, що подібні речі можуть траплятися і в Linux - в ідеалі мені не потрібно відкривати пристрій, щоб визначити його тип. Цікаво, чи існує також спосіб викликати ioctl
функції без відкритого чи відкрити пристрій таким чином, щоб він не викликав з'єднання?
Що я повинен зробити?