我需要检测嵌入式系统上插入或拔出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
这是免费的,这对我来说是个大问题。
答案 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=usb
和ACTION=add
或USB ACTION=remove
的消息拔掉事件。