C ++ Обнаружение подключенного / отключенного USB-устройства

Мне нужно определить, когда в моей встроенной системе подключено или отключено последовательное USB-устройство, и узнать, что tty с ним связано.

Моя система работает на ядре Linux 2.6.

Поскольку у меня нет доступа на запись к udev правилам, в настоящее время я пытаюсь получить эту информацию из файловой системы, ища изменения в /sys/bus/usb/devices каталоге. Однако я столкнулся с некоторыми проблемами при таком подходе.

Я знаю, какой Id BUS подключенного USB-порта (например, 1-1.3). Итак, я ищу связанный tty (ищу каталог в /sys/bus/usb/devices/<Id BUS>:1.0/tty/ - например, /sys/bus/usb/devices/1-1.3:1.0/tty/ttyACM0). Таким образом, я знаю, что должен использовать /dev/ttyACM0 для связи с моим устройством. Но иногда этого устройства (/dev/ttyACM0) не существует.

Есть ли лучший способ получить эту информацию?

Я даже подумал попытаться получить эту информацию из системного журнала, но не знаю, хорошая ли это идея.

Редактировать:

Только для пояснения, моя система должна иметь возможность обнаруживать изменения состояния на шине USB, то есть обнаруживать, когда новое устройство подключено (и получает имя tty, связанное с ним), или когда существующее отключено.

Система контролирует до N USB / последовательных устройств, которые подключены к ней с помощью концентратора USB. Во время его нормального выполнения новые устройства могут быть подключены, существующие устройства могут быть удалены (или перезагружены удаленной командой - вне этой области). Когда устройство перезагружается, оно может получить tty, отличное от того, которое использовалось ранее (например, ttyACM0 -> ttyACM3), поскольку ядро ​​назначает ему tty, который на данный момент свободен, и для меня это большая проблема.


person Valmir    schedule 16.05.2017    source источник


Ответы (3)


Netlink является предпочтительным механизмом для связи между ядром и пользовательским пространством.

Вы должны создать сокет Netlink с семейством NETLINK_KOBJECT_UEVENT, прослушивать этот сокет и отфильтровывать сообщения, содержащие SUBSYSTEM=usb и ACTION=add для событий подключения USB или ACTION=remove для событий отключения USB.

person luislopezmartin    schedule 11.05.2018

Я написал библиотеку абстракции USB под названием libusbp. Вам следует взглянуть на его пример имени_порта, который показывает как использовать libusbp для получения имени последовательного порта (например, /dev/ttyACM0) для последовательного устройства USB. За кулисами libusbp получает эту информацию с помощью libudev.

person David Grayson    schedule 16.05.2017
comment
Спасибо @ david-grayson, я отредактировал вопрос, добавив более подробный обзор проблемного сценария. Возможно ли, используя вашу библиотеку, соответствовать описанным требованиям? - person Valmir; 17.05.2017
comment
во встроенной системе, к сожалению, нет libudev, присутствует только mdev, поэтому я не могу использовать вашу библиотеку. - person Valmir; 17.05.2017

Проверьте, удален ли виртуальный файл с помощью stat.

#include <sys/statvfs.h>

...

struct stat sb;
return (stat("/dev/ttyUSB0", &sb) == 0); // true if open, false otherwise
person jjxtra    schedule 17.10.2017