我的测试设备由以下部分组成:
- 连接到主 PC 的 USB 集线器,该集线器嵌入在测试夹具中并使用,因此我们只有 1 根 USB 电缆从夹具连接到 PC。
- 一个 Arduino UNO,通过 USB 连接到集线器
- 通过USB连接到USB集线器的测量仪器(功率计)
- 通过 USB 连接到 USB 集线器的另一个测量设备(温度计)
- 一个 Python 脚本,用于从主 PC 运行测试程序并与 Arduino 和两台仪器进行通信。
所有这些都适用于我的第一个夹具,但我现在需要复制测试设置(一台 PC 上的 3 个测试夹具)。我想udev
为设备分配持久规则,以便测试人员稍后只需根据他们使用的夹具选择 1、2 或 3,这样他们就不需要摆弄端口号。
有没有一种方法可以制定一条基本上是这样的规则:
assign symlink /dev/powermeter01 to the powermeter that is on the same USB hub as the Arduino with the serial xxxxxxx
?
对于 Arduino,这很容易,因为udevadm
信息中有正确的序列号,但对于功率计,序列号始终相同并为温度计,根本就没有序列号(谢谢便宜的供应商!!!)。
USB 集线器显然也没有串行。
答案1
好吧,这不是问题的答案,而是给我带来了解决方案。就是这样。
我对 Udev 规则进行了相当多的修改,无法得到比我的 Arduino 持续出现更好的东西/dev/arduino01
(将使用/dev/arduino02
, /dev/arduino03
,... 对于其他夹具)
我的测试脚本是用Python编写的,我刚刚发现有一个很好的库叫做普尤德夫所以我决定看看这条路线。
仅仅几分钟后,我就结束了
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 端口,我现在可以将其输入到我的测试例程脚本中。
我们之间更精明的人会发现我的临时记录器是通过 pl2303 USB 串行连接的,而我的功率计是通过 CP2102 USB 串行连接的。
答案2
udev
不仅有序列号来匹配设备,您可以使用任何可用的属性。
udevadm info /dev/...
因此,您可以在具有相同序列号的两个设备中使用几乎任何不同的东西udevadm info -a /dev/...
。
如果您可以共享每个设备的这些输出,我也许可以提供帮助。从您的回答来看,您似乎已经得到了不同的供应商/型号,因此可以在 udev 规则中使用。