2014-07-24 182 views
2

我正在使用Linux中的USB设备并编写了一个库来控制此设备。不用进入太多的细节,设备使用标准的UART协议,所以我只需要打开一个与open的串行连接,配置波特率,停止位,奇偶等相关参数等。 ,并开始位反转寄存器。检测某个连接的USB设备

图书馆工作正常,但是,它的硬编码的假设,这个设备是/ dev/ttyUSB0。也就是说,这是我通过open。如果打开失败,我退出。

我想要做的是检测该设备是否存在,无论它是否为/dev/ttyUSB0,/dev/ttyUSB1等,甚至检测是否有多个这些设备连接。

我可以编写代码来查询将返回序列号,产品ID等设备上的某些寄存器,这样我就可以检测到什么是对USB的另一端确实是我的设备......但怎么能我再次在本地C中找到连接的USB设备列表?

还是有这样做的更优雅的方式,如与它交互的内核模块,还是什么?我可以提供它实际使用的USB驱动程序,但是在查看代码时我有点失落。

感谢您的任何见解。

+0

我知道'Linux'命令--->'lsusb' - 它的编码会给你一些想法! –

+0

虽然我不能很好回答你,但值得注意的是,Apple和Spotify使用守护进程来检测媒体设备的连接。 –

+0

在更高级别的应用程序中,我将运行一个单独的线程通过调用我的库中的函数来跟踪此情况。我只是不确定如何在我的图书馆中实现这一点。 – justynnuff

回答

2

优雅的方法是使用udev为设备创建描述符符号链接。行这样的事情添加到/etc/udev/rules.d

SUBSYSTEM=="tty",ENV{ID_MODEL}=="My_FlowMeter_Model",ENV{ID_USB_INTERFACE_NUM}=="00",SYMLINK+="flowmeter",RUN+="/bin/su pi -c /home/pi/record-flowmeter.sh 

这是一个非常略加修改我的研究小组使用,以收集连接到电池供电的树莓派盒USB设备的数据的实际udev规则的。它还可以自动运行的脚本,如果你想知道“真正”的设备文件名具有像

stty -F /dev/flowmeter 500000 -ixon -echo -icanon 

命令,你可以做readlink /dev/flowmeter。但对于大多数使用,你可以只使用链接:fd = open("/dev/flowmeter");(或将其作为参数传递给你的程序)

当然,你应该用一个简短的名称替换flowmeter为自己的设备,以及更新的基础上,ID_MODELlsusb输出。

多个设备有点复杂,但有很多udev规则的例子。

+0

还不错。我认为我完全可以通过udev规则来完成这项工作。谢谢。 – justynnuff

1

在Linux上,你正在寻找的信息是在/ sys文件系统,特别是在/sys/bus/usb/devices。从那里你将需要搜索文件系统来找到你的设备。

举例来说,我只是将一台USB串行器插入我的Linux(内核版本2.6.35)和设备/sys/bus/usb/devices/2.1-8下出现。在这里,我可以通过检查文件idVendoridProduct来发现这是我的vendorId设备:deviceId。这里有一个名为2.1-8:1:0的目录,其中包含一个名为ttyUSB0的目录。

显然,要找到您的设备,您需要使用代码(或使用find的shell脚本)扫描目录树,查找正确的条目。

+0

为什么要重写udev? –