Обнаружение COM-порта в Linux

Пожалуйста, дайте мне знать, есть ли какой-либо API, системный вызов, функция (в Linux), которую я могу использовать в своей программе C для динамического обнаружения COM-порта, т. Е. Всякий раз, когда в порт вставлен USB-модем, я смогу обнаружить этот COM-порт, используя API, или системный вызов, или функцию в моей программе C.


person ind79ra    schedule 03.04.2013    source источник
comment
Тот же вопрос насколько я понимаю, хотя этот получил лучшие ответы.   -  person artless noise    schedule 03.04.2013


Ответы (2)


В зависимости от вашего модема, устройство последовательного порта USB может отображаться как /dev/ttyUSBn или /dev/ttyACMn, где n — это число, начинающееся с 0.

Вы можете настроить правило udev для автоматической реакции на вставку или извлечение устройства.

Если вы хотите сделать это самостоятельно на C, вам нужно использовать netlink(7) сокетов. Если вы не хотите возиться с ними, вероятно, более простой подход — просто использовать утилиту udevadm, предоставляемую пакетом udev (udevadm использует netlink внутри), что-то вроде этого:

 udevadm monitor --kernel

Если вы собираетесь использовать его в своей программе на C, просто вызовите его в канале следующим образом:

 stdbuf -o0 udevadm monitor --kernel

и настройте цикл select, чтобы он мог реагировать немедленно. Обертка в stdbuf необходима, чтобы избежать буферизации, предоставляемой udevadm.

person mvp    schedule 03.04.2013
comment
В моем случае мне пришлось использовать -o0 вместо -i0. - person HeyYO; 20.04.2016
comment
@HeyYO: ты прав, это опечатка. Спасибо, исправлено! - person mvp; 20.04.2016

В Linux последовательные порты не называются COMx. Они (настоящие последовательные порты) обычно называются /dev/ttySx, где x — число, начиная с 0 для COM1, 1 для COM2 и т. д.

Если вам нужен список, вы должны найти в /dev ttyS устройств.

Вот очень подробная страница для программирования последовательного порта в Linux:

Наконец, обратите внимание, что быстрый поиск в Google имеет большое значение для такие общие вопросы!

person Jonathon Reinhart    schedule 03.04.2013
comment
Спасибо Джонатон за ваш ответ. Я иногда обнаруживаю USB-модем в ttyUSB00 - ttyUSB02, что я узнал, введя команды «lsusb» и «lsusb -t», но мне нужно обнаружить эти порты с помощью функции в моей программе C, я посмотрю ссылку, которую вы прислали. Просто спросил еще одну вещь, я также обнаружил, что иногда это /dev/sr0 или /dev/sr1, я немного запутался, не могли бы вы дать мне некоторое представление о том, как выходит /dev/srX? Заранее спасибо. - person ind79ra; 03.04.2013
comment
Похоже, что ответ mvp ниже содержит более подробную информацию об этих динамически добавляемых последовательных портах. - person Jonathon Reinhart; 03.04.2013