写入多个相同的设备,python USB,devi上没有序列号

2024-05-17 13:27:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在从Python控制一些中继卡。我可以很好地配置和控制单个中继卡(pyusb,python3.6 ubuntu16.04)。使用标准方法识别和配置USB设备。在

dev = usb.core.find(idVendor=0x1a86, idProduct=0x7523)

但是,我需要使用多个相同类型的设备,并且可以很好地找到它们:

^{pr2}$

问题的出现是因为两个设备的get_active_configuration()是相同的。我可以查询设备总线和设备地址,但是,我不知道如何使用这个USB连接信息来识别电路板,以及在python中仅使用总线地址执行串行写入功能。在

注意:在我的研究中,pyusb documentation和其他几个论坛帖子都指出使用usb连接总线地址来区分多个相同的设备,因此我认为这是一种有效的方法,然而,我不确定如何编写代码来实现这一点,因为我看到的大多数其他示例都是为了匹配idVendor+idProduct。在

在这里发布我现在用来访问一个设备的代码:

import time
import usb.core
import usb.util

dev = usb.core.find(idVendor=0x1a86, idProduct=0x7523)

if dev is None:
    raise ValueError("Device not found")

if dev.is_kernel_driver_active(0):
    dev.detach_kernel_driver(0)

cfg = dev.get_active_configuration()
intf = cfg[(0,0)]

ep = usb.util.find_descriptor(
    intf,
    # match the first OUT endpoint
    custom_match = \
    lambda e: \
        usb.util.endpoint_direction(e.bEndpointAddress) == \
        usb.util.ENDPOINT_OUT)

assert ep is not None

# example relay hex serial command
cl_all = [0x3A, 0x46, 0x45, 0x30, 0x46, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x32, 0x46, 0x46, 0x46, 0x46, 0x45, 0x33, 0x0D, 0x0A]

# example write operation
ep.write(cl_all)

所以基本上,dev基本上会选择其中一种配置,如果我在usb.core.find,两块板我都能找到。只是不知道如果没有序列号,如何分别对它们进行寻址。经过研究,我认为(但我不确定)第二块板的接口存储在cfg[(1,0)],但首先,我未能成功地实现它,其次,它不一定是永久性的,每次我启动或是插拔这些板。在

更新/编辑:在这张卡上再工作20个小时左右,与制造商和其他一些处理同一问题的人(下面是github链接)进行通信后,我得出的结论是该板不支持序列化。我换了一个基于以太网的中继卡,虽然价格更贵,但可以很容易地为每个板设置一个固定的IP地址,从而实现我的目标。我不相信这个问题可以解决我的USB硬件问题,而且,主板无法返回一个简单的状态(我有两个这样的板,所以它不是一个单一的设备错误)。在

https://github.com/ondrej1024/crelay/issues/21


Tags: coredevimportis地址utilfindcfg