检测某些连接的USB设备

时间:2014-07-24 19:53:03

标签: c linux driver uart

我正在使用Linux中的USB设备并编写了一个库来控制该设备。

在没有进入太多细节的情况下,设备使用标准的UART协议,因此我所要做的就是打开与open的串行连接,配置相关参数,如波特率,停止位,奇偶校验,等等,并启动bit-banging寄存器。

该库工作正常,但它的硬编码假设此设备是/ dev / ttyUSB0。也就是说,这是我传递给open的内容。如果打开失败,我退出。

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

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

中连接的USB设备列表

OR是否有一种更优雅的方式来实现这一点,例如与其内核模块连接,或者其他什么?我可以提供它实际使用的USB驱动程序,但在查看代码时我有点迷失。

感谢您的任何见解。

2 个答案:

答案 0 :(得分: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

这是我的研究小组用来从连接到电池供电的Raspberry Pi盒子的USB设备收集数据的实际udev规则的略微修改版本。它还会自动运行脚本,其中包含

之类的命令
stty -F /dev/flowmeter 500000 -ixon -echo -icanon

如果你想知道"真实"设备文件名,您可以readlink /dev/flowmeter。但是对于大多数用途,您只需使用链接:fd = open("/dev/flowmeter");(或将其作为参数传递给您的程序)

当然,您应该使用自己设备的简称替换flowmeter,并根据ID_MODEL的输出更新lsusb

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

答案 1 :(得分: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脚本)来扫描目录树,寻找正确的条目。