如何使用“同级”设备的序列号(对于没有唯一序列号的 USB 设备)制定 udev 规则?

如何使用“同级”设备的序列号(对于没有唯一序列号的 USB 设备)制定 udev 规则?

我的测试设备由以下部分组成:

  • 连接到主 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 规则中使用。

相关内容