Как правильно получить список всех доступных последовательных портов / устройств в системе Linux?
Другими словами, когда я перебираю все устройства /dev/
, как мне классическим способом определить, какие из них являются последовательными, то есть те, которые обычно поддерживают скорость передачи данных и управление потоком RTS / CTS ?
Решение будет закодировано на C.
Я спрашиваю, потому что я использую стороннюю библиотеку, которая явно ошибается: кажется, что она только повторяется /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)
Если этот вызов не возвращает ошибки, значит, это, по-видимому, последовательное устройство.
Я нашел похожий код в Serial Programming / termios , который также предложил добавить эту O_NOCTTY
опцию.
Однако у этого подхода есть одна проблема:
Когда я тестировал этот код в BSD Unix (то есть в Mac OS X), он тоже работал. Однако последовательные устройства, которые предоставляются через Bluetooth, заставляют систему (драйвер) пытаться подключиться к устройству Bluetooth, что занимает некоторое время, прежде чем оно вернется с ошибкой тайм-аута. Это вызвано простым открытием устройства. И я могу представить, что подобное может происходить и в Linux - в идеале мне не нужно открывать устройство, чтобы определить его тип. Интересно, есть ли способ вызывать ioctl
функции без открытия или открывать устройство таким образом, чтобы это не приводило к установлению соединений?
Что я должен делать?