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

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

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

Поскольку у меня нет доступа к записи 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 HUB. Во время его нормального выполнения новые устройства могут быть подключены, существующие устройства могут быть удалены (или перезагружены удаленной командой вне этой области). Когда устройство перезагружено, оно может получить другое tty из предыдущего, используемого ранее (например, ttyACM0 -> ttyACM3), поскольку ядро ​​обозначает tty который свободен в данный момент, и это большая проблема для меня.

3 ответа

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

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

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

#include <sys/statvfs.h>

...

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

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

Другие вопросы по тегам