C ++检测插入/拔出USB串行设备

时间:2017-05-16 19:55:31

标签: linux embedded usb hotplugging

我需要检测嵌入式系统上插入或拔出USB串行设备的时间,并知道与其关联的tty是什么。

我的系统运行在2.6 Linux内核上。

由于我没有udev规则的写入权限,现在我正试图从文件系统获取此信息,在/sys/bus/usb/devices目录中查找修改。但是,我在使用这种方法时遇到了一些问题。

我知道连接的USB端口的Id BUS是什么(例如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 个答案:

答案 0 :(得分:0)

我写了一个名为libusbp的USB抽象库。您应该查看其port_name example,其中显示了如何使用libusbp获取USB串行设备的串行端口名称(例如/dev/ttyACM0)。在幕后,libusbp使用libudev获取此信息。

答案 1 :(得分:0)

使用stat。

检查是否删除了虚拟文件
#include <sys/statvfs.h>

...

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

答案 2 :(得分:0)

Netlink是内核和用户空间之间通信的首选机制。

您将创建一个包含系列NETLINK_KOBJECT_UEVENT的Netlink套接字,侦听该套接字并过滤掉包含{插入事件SUBSYSTEM=usbACTION=add或USB ACTION=remove的消息拔掉事件。