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

时间:2019-01-02 14:22:06

标签: python python-3.x usb linux-device-driver pyusb

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

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

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

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

问题到来是因为两个设备的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)

因此,基本上,开发人员基本上可以选择其中一种配置,如果我在usb.core.find中使用find_all = True标志,则可以找到这两块板。如果没有序列号,只是不确定如何分别解决它们。研究它之后,我认为(但不确定)第二块板的接口然后存储在cfg [(1,0)]中,但是首先,我无法成功实现它,其次,不一定在每次启动时或插入和拔出板子时都是永久的。

更新/编辑:使用此卡再过20个小时左右,并与制造商和其他从事相同问题的人员(在下面的github链接)相对应后,我得出的结论是该板没有支持序列化。我转而使用基于以太网的中继卡,尽管价格更高,但能够轻松地为每个板设置固定的IP地址并实现我的目标。我不认为这个问题可以通过我遇到的USB硬件问题解决,而且该板无法返回简单状态(而且我有两个板,所以它不是单设备错误)。

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

0 个答案:

没有答案