其他分享
首页 > 其他分享> > 如何使用“兄弟”设备的序列号制作udev规则(对于没有唯一序列号的USB设备)?

如何使用“兄弟”设备的序列号制作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