如何使用“兄弟”设备的序列号制作udev规则(对于没有唯一序列号的USB设备)?
作者:互联网
我有测试设备,由以下部分组成:
>连接到主PC的USB集线器,集线器嵌入在测试夹具中并且被使用,因此我们只有1根USB电缆从夹具运行到PC.
>一个Arduino UNO,通过USB连接到Hub
>通过USB连接到USB集线器的测量仪器(功率计)
>另一个通过USB连接到USB集线器的测量设备(温度计)
>一个Python脚本,它从主PC运行测试程序并与Arduino和两个仪器通信.
所有这一切都适用于我的第一个夹具,但我现在需要复制测试设置(在一台PC上测试3个夹具).我想为设备分配udev持久性规则,以便测试人员稍后只需要根据他们使用的夹具选择1,2或3,这样他们就不需要操纵端口号.
有没有办法做一个基本上会说的规则:
将symlink / dev / powermeter01分配给与Arduino在同一USB集线器上的串联xxxxxxx的功率计?
对于Arduino,这很简单,因为udevadm信息中有正确的序列号,但对于功率计,序列号总是相同的,对于温度计,根本没有序列号(谢谢廉价供应商!!!) .
USB集线器显然没有串行.
解决方法:
嗯,这不是问题的答案,而是给我一个解决方案.所以在这里.
我用Udev规则做了很多调整,无法得到比我的Arduino持续出现在/ dev / arduino01上更好的东西(将使用/ dev / arduino02,/ dev / arduino03,…用于其他夹具)
我的测试脚本是用Python编写的,我发现有一个很好的库叫做pyudev,所以我决定看一下这条路线.
几分钟后,我结束了
from pyudev import *
context = Context()
Arduino = Device.from_device_file(context, '/dev/arduino01')
Hub = Arduino.find_parent("usb","usb_device").find_parent("usb") #first find_parent brings me up to the USB device Arduino, another find_parent brings me to the Hub
Fixture = Enumerator(context)
for dev in Fixture.match_parent(Hub).match_subsystem('tty'):
if (dev.get('ID_VENDOR_ID')=="10c4" and dev.get('ID_MODEL_ID')=="ea60"): #I got those ID through udevadm.
powermeter=dev
if (dev.get('ID_VENDOR_ID')=="067b" and dev.get('ID_MODEL_ID')=="2303"): #I got those ID through udevadm.
temprecorder=dev
print('Arduino in on ' + str(Arduino.device_node)) #prints : Arduino is on /dev/ttyACM0
print('Powermeter in on ' + str(powermeter.device_node)) #prints : Powermeter is on /dev/ttyUSB1
print('Thermometer in on ' + str(temprecorder.device_node)) #prints : Thermometer is on /dev/ttyUSB0
这给了我测试夹具的3个设备的USB端口,我现在可以将它提供给我的测试例程脚本.
我们之间更精明的人会看到我的temprecorder是通过一个pl2303 USB串口和我的功率计通过CP2102 USB串口.
标签:python,arduino,usb,udev,usb-device 来源: https://codeday.me/bug/20190813/1646039.html