Как найти все последовательные устройства (ttyS, ttyUSB, ..) в Linux, не открывая их? - PullRequest
96 голосов
/ 27 марта 2010

Как правильно получить список всех доступных последовательных портов / устройств в системе 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)

Если этот вызов не возвращает ошибку, то это, очевидно, последовательное устройство.

Я нашел похожий код в Последовательное программирование / termios , в котором также предлагается добавить опцию O_NOCTTY.

С этим подходом есть одна проблема:

Когда я тестировал этот код в BSD Unix (то есть в Mac OS X), он также работал. Однако , последовательные устройства, которые предоставляются через Bluetooth, заставляют систему (драйвер) пытаться подключиться к устройству Bluetooth, что занимает некоторое время, прежде чем оно вернется с ошибкой тайм-аута. Это вызвано просто открытием устройства. И я могу представить, что подобные вещи могут происходить и в Linux - в идеале, мне не нужно открывать устройство, чтобы выяснить его тип. Интересно, есть ли способ вызвать функции ioctl без открытия или открыть устройство таким образом, чтобы оно не вызывало соединения?

Что мне делать?

Ответы [ 11 ]

0 голосов
/ 28 марта 2016

Библиотека менеджера последовательной связи имеет множество API и функций, предназначенных для выполнения требуемой задачи Если устройство является USB-UART, можно использовать его VID / PID. Если устройство является BT-SPP, то могут использоваться API-интерфейсы для конкретной платформы. Взгляните на этот проект для программирования последовательного порта: https://github.com/RishiGupta12/serial-communication-manager

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...