我正在使用Linux中的USB设备并编写了一个库来控制该设备。
在没有进入太多细节的情况下,设备使用标准的UART协议,因此我所要做的就是打开与open
的串行连接,配置相关参数,如波特率,停止位,奇偶校验,等等,并启动bit-banging寄存器。
该库工作正常,但它的硬编码假设此设备是/ dev / ttyUSB0。也就是说,这是我传递给open
的内容。如果打开失败,我退出。
我想要做的是检测此设备是否存在,无论它是/dev/ttyUSB0
,/dev/ttyUSB1
等。甚至检测是否有多个这些设备已连接。
我可以编写代码来查询设备上的某些寄存器,这些寄存器将返回序列号,产品ID等,这样我就可以检测到USB的另一端确实是我的设备......但我怎么能再次找到本地C?
中连接的USB设备列表OR是否有一种更优雅的方式来实现这一点,例如与其内核模块连接,或者其他什么?我可以提供它实际使用的USB驱动程序,但在查看代码时我有点迷失。
感谢您的任何见解。
答案 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
下。在这里,通过检查文件idVendor
和idProduct
,我可以通过vendorId:deviceId找到这是我的设备。这里有一个名为2.1-8:1:0
的目录,其中包含一个名为ttyUSB0
的目录。
显然,要找到您的设备,您需要使用代码(或使用find
的shell脚本)来扫描目录树,寻找正确的条目。