我有两个usb设备,它们被ACM驱动程序识别,我正在用C语言开发一个程序来与它们通信。由于每个命令都不同,我需要知道每个命令的名称(usb/acm/X)。
在给定vendorId和productId的情况下,我如何获得此名称?我尝试过解析dmesg文本,但在某些情况下,我可能会一行接一行地使用"ttyACMX:USB ACM设备"这两行。我可以解析每个设备在dmesg中显示名称的顺序,并在"ttyACMX"中使用相同的数字,但这迫使我也解析断开连接消息,所有这些都变得有点脏。
我已经看到我需要的信息在为每个设备创建的tty_driver结构中,我相信我可以比解析dmesg更容易地获得这些信息。
有人能给我指个正确的方向吗?
libudev
(C)可能是一个解决方案,也可以看看ModemManager
守护进程(C,基于glib)的来源
使用libudev或一些更高级别的库,如gudev(基于GLib的libudev)。除非您的设备是真正的移动宽带(2G/3G/4G)调制解调器,否则不要使用ModemManager。
我发现这个线程很有帮助:http://forum.pololu.com/viewtopic.php?f=16&t=6741
您可以在/etc/udev/rules.d
中创建一个udev规则文件,该文件具有如下规则:
KERNEL="ttyACM0",SUBSYSTEM="tty",SUBSYSTEMS="usb",ATTRS{idVendor}=="1fb",ATTRS{idProduct}=="008c",ATTRS{serial}="00053419",MODE="0666",SYMLINK+="TTYS_002"
我认为,当您插入具有指定供应商ID、产品ID和序列号的CDC ACM设备时,这将生成一个名为/dev/TTYS_002
的设备。