linux udev 检测u盘的插入和拔出,在Linux中C检测插入/拔出USB串行设备

我需要检测何时在我的嵌入式系统上插入或拔出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,这对我来说是个大问题.

我写了一个名为

libusbp的USB抽象库.你应该看看它的

port_name example,它展示了如何使用libusbp来获取USB串行设备的串口名称(例如/ dev / ttyACM0).在幕后,libusbp使用libudev获取此信息.

下面是使用udev检测USB热插拔的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <libudev.h> int main() { struct udev *udev = udev_new(); // 创建udev实例 if (!udev) { perror("udev_new"); exit(1); } struct udev_monitor *mon = udev_monitor_new_from_netlink(udev, "udev"); // 创建监视器,监听udev事件 udev_monitor_filter_add_match_subsystem_devtype(mon, "usb", NULL); // 监视usb设备 udev_monitor_enable_receiving(mon); // 开始接收udev事件 while (1) { fd_set fds; FD_ZERO(&fds); FD_SET(udev_monitor_get_fd(mon), &fds); // 将udev监视器的文件描述符加入到文件描述符集合 // 等待事件的发生 if (select(udev_monitor_get_fd(mon) + 1, &fds, NULL, NULL, NULL) > 0) { if (FD_ISSET(udev_monitor_get_fd(mon), &fds)) { struct udev_device *dev = udev_monitor_receive_device(mon); // 获取udev事件对应的设备信息 if (dev) { const char *action = udev_device_get_action(dev); // 获取事件类型 const char *devnode = udev_device_get_devnode(dev); // 获取设备节点 const char *vendor = udev_device_get_property_value(dev, "ID_VENDOR_FROM_DATABASE"); // 获取设备的制造商信息 const char *product = udev_device_get_property_value(dev, "ID_MODEL_FROM_DATABASE"); // 获取设备的型号信息 printf("Action: %s\n", action); printf("Device Node Path: %s\n", devnode); printf("Vendor: %s\n", vendor); printf("Product: %s\n\n", product); udev_device_unref(dev); // 释放设备信息占用的资源 } } } } udev_monitor_unref(mon); // 释放udev监视器占用的资源 udev_unref(udev); // 释放udev实例占用的资源 return 0; } ``` 这个代码会不断地监听udev事件,当有USB设备插入拔出时,就会打印出相应的信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值