6

我需要检测 USB 串行设备何时在我的嵌入式系统上插入或拔出,​​并知道tty与之相关联的内容。

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

由于我没有对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 HUB 插入的 USB/串行设备。在其正常执行期间,可以插入新设备,可以移除现有设备(或通过远程命令重新启动 - 超出此范围)。当一个设备重新启动时,它可能会收到tty与之前使用的不同的(例如ttyACM0-> ttyACM3),因为内核指定它 atty目前是免费的,这对我来说是一个大问题。

4

3 回答 3

1

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

您将使用 family 创建一个 Netlink 套接字,侦听该套接字并NETLINK_KOBJECT_UEVENT过滤掉包含USB 插入事件或USB 拔出事件的消息。SUBSYSTEM=usbACTION=addACTION=remove

于 2018-05-11T16:28:02.953 回答
0

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

于 2017-05-16T21:34:30.020 回答
0

使用 stat 检查是否删除了虚拟文件。

#include <sys/statvfs.h>

...

struct stat sb;
return (stat("/dev/ttyUSB0", &sb) == 0); // true if open, false otherwise
于 2017-10-17T19:44:05.083 回答