如何使用 PyUSB 写入控制端点

2024-02-23

我有一个 USB 设备,其代码如下

import usb.core
import usb.util

device = usb.core.find(idVendor=0xC251, idProduct=0x2201)
print(device)

produces

DEVICE ID c251:2201 on Bus 002 Address 020 =================
 bLength                :   0x12 (18 bytes)
 bDescriptorType        :    0x1 Device
 bcdUSB                 :  0x200 USB 2.0
 bDeviceClass           :    0x0 Specified at interface
 bDeviceSubClass        :    0x0
 bDeviceProtocol        :    0x0
 bMaxPacketSize0        :   0x40 (64 bytes)
 idVendor               : 0xc251
 idProduct              : 0x2201
 bcdDevice              :  0x100 Device 1.0
 iManufacturer          :    0x1 LASER Driver 
 iProduct               :    0x2 LASER Driver IJS
 iSerialNumber          :    0x3 0001A0000000
 bNumConfigurations     :    0x1
  CONFIGURATION 1: 100 mA ==================================
   bLength              :    0x9 (9 bytes)
   bDescriptorType      :    0x2 Configuration
   wTotalLength         :   0x22 (34 bytes)
   bNumInterfaces       :    0x1
   bConfigurationValue  :    0x1
   iConfiguration       :    0x0 
   bmAttributes         :   0xc0 Self Powered
   bMaxPower            :   0x32 (100 mA)
    INTERFACE 0: Human Interface Device ====================
     bLength            :    0x9 (9 bytes)
     bDescriptorType    :    0x4 Interface
     bInterfaceNumber   :    0x0
     bAlternateSetting  :    0x0
     bNumEndpoints      :    0x1
     bInterfaceClass    :    0x3 Human Interface Device
     bInterfaceSubClass :    0x0
     bInterfaceProtocol :    0x0
     iInterface         :    0x4 HID
      ENDPOINT 0x81: Interrupt IN ==========================
       bLength          :    0x7 (7 bytes)
       bDescriptorType  :    0x5 Endpoint
       bEndpointAddress :   0x81 IN
       bmAttributes     :    0x3 Interrupt
       wMaxPacketSize   :   0x40 (64 bytes)
       bInterval        :    0x1

在Python 3下的Ubuntu 20.04中。可以看出,没有OUT端点。我不是 USB 专家,但据我所知,我们需要一个输出端点来将数据发送到设备,因此该设备看起来像一个只读设备。

但是,我知道有某种方法可以向设备发送/写入数据,因为它是一个激光控制器,并且在 Windows 中我可以打开/关闭激光、更改强度等。我有部分 C++ 源代码该控制器用于 Windows,它使用hidapi https://github.com/libusb/hidapi。根据的文档hid_write https://codedocs.xyz/GerryFerdinandus/hidapi/group__API.html#gad14ea48e440cf5066df87cc6488493af当没有其他输出端点时,它会写入“控制端点”,这里似乎就是这种情况。所以现在我想使用Python复制这个PyUSB https://github.com/pyusb/pyusb.

到目前为止我有这个

import usb.core
import usb.util
import array

device = usb.core.find(idVendor=0xC251, idProduct=0x2201)

if device is None:
    raise RuntimeError('Device not found')
interface = device[0].interfaces()[0]
endpoint = device[0].interfaces()[0].endpoints()[0] # This is the in endpoint, I can read the status of the laser from here and it works fine.

if device.is_kernel_driver_active(interface.bInterfaceNumber):
    device.detach_kernel_driver(interface.bInterfaceNumber)

cmd = chr(90) # This is the command to turn off the laser.
packet = chr(0) + cmd + chr(0)*(64-len(cmd)-1) # The first byte has to be always 0, see https://codedocs.xyz/GerryFerdinandus/hidapi/group__API.html#gad14ea48e440cf5066df87cc6488493af
packet = array.array('B', [ord(c) for c in packet])
bytes_sent = endpoint.write(packet)
print(bytes_sent) # This prints out 64 so it is fine.

这似乎正在书写,但激光什么也没做(它应该关闭)。我怀疑它以某种方式写入“IN端点”而不是“控制端点”。我想发送这个packet到控制端点。如何才能做到这一点?

PD:我也尝试过

device.write(0x0, packet)

但这会产生ValueError: Invalid endpoint address 0x0.


要写入端点 0,您需要device.ctrl_transfer(bmRequestType, bmRequest, wValue, wIndex, packet)代替endpoint.write(packet).

The bmRequestType, bmRequest, wValue and wIndex对应于USB控制请求中的相同元素。 Windows 软件使用的事实hidapi建议控制传输根据 USB HID 规范完成。

这个答案在 Stack Overflow 上 https://stackoverflow.com/a/52368526/9197000描述如何在普通 PyUSB 上进行 USB HID 设置/获取操作。

但由于您要移植的源代码使用hidapi, 使用Python hidapi 接口 https://pypi.org/project/hidapi/可能会使这个过程更加简单。这个问题 https://stackoverflow.com/q/68101621/9197000有一个使用的例子hidapi在Python中,答案也谈到了替代方案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 PyUSB 写入控制端点 的相关文章

随机推荐

  • JMESpath 表达式,用于按属性过滤对象并返回设置了此属性的对象名称列表

    是否可以编写 JMESPath 表达式来返回设置了特定子属性值的对象名称列表 在下面的示例中 我想获取所有主机名的列表 其中文件存在 stat 存在设置为 true 我的目标是使用 Ansible hostvars 结构来获取存在特定文件的
  • 相当于 .NET 中的 Windows 错误代码

    Microsoft 为 Windows 提供了一系列标准化错误代码 http msdn microsoft com en us library ms681381 VS 85 aspx 当适用时 我发现它们可以在我自己的应用程序中参考 而不是
  • 如何比较相似的代码库?

    我们有几个基于相同代码库构建的 C 项目 它们之间有很多相似之处和共同的代码 但它们是独立开发的 来源未以任何方式共享 即使底层代码没有改变 并且个别行将被调整 更改和替换 类和文件也将被重命名 我希望能够比较不同的代码库并找出有多少代码仍
  • 理解 jQuery 中的 $.proxy()

    From docs http api jquery com jquery proxy 我明白那个 proxy 会改变作为参数传递的函数的范围 有人可以更好地向我解释一下吗 我们为什么要这样做 它最终要做的是确保this函数中将是您想要的值
  • 从 Arrays.asList 返回的列表是否保持与原始数组集合相同的顺序?

    我有一个 ArrayList 我对其进行了多次迭代 并且看起来它没有保持迭代的顺序 我更深入地研究 似乎为这次迭代编写的自定义迭代器标记 由其他人 首先获取传入的 ArrayList 并在迭代之前使用 Arrays asList 将其桥接到
  • 如何从内存字节创建“假”dart:io 文件?

    我有一个 blob 的内存字节 但我想要处理这个 blob 的 API 只接受 dart io File 对象 有没有办法创建一个 假 dart io File 简单地包装我的内存字节 以便我可以将这个 假 文件传递给我的API 假设文件系
  • 在 C++ 程序上使用 mpicc 链接失败

    我正在运行 Ubuntu 11 04 64 位 我已经安装了 OpenMPI 我正在尝试构建以下代码 这是 Gropp Lusk Skjellum 所著的 Using MPI 一书中测试问题的片段 include
  • 在java中如何拥有具有唯一键的HashMap?

    在 Java 中如何获得具有唯一键的 HashMap 或者甚至在 HashMap 中拥有唯一的键是否有意义 或者默认情况下键是唯一的 我是新手 谢谢 哈希映射键是唯一的 添加重复的密钥 然后它将被覆盖 HashMap hm new Hash
  • PE文件中的MZ签名有什么用?

    我正在开发一个程序 它将解析 PE 对象以获取各种信息 但阅读规范后 我无法找出为什么存在 MZ 字节 因为我无法在这 2 个字节应该代表的机器类型列表中找到它 谁能澄清一下吗 MZ 签名是 MS DOS 可重定位 16 位 EXE 格式使
  • 即时搜索算法

    哪种类型的算法对于搜索正在搜索的内容最快 我意识到这已经很接近于问谷歌即时搜索是如何工作的了 但我不是算法专家 而且我对它们越来越感兴趣 像这样的搜索是使用后缀树或类似的东西完成的吗 我想我只是对查询小字符串感兴趣 而不是像谷歌那样查询大量
  • 将 HttpClient 与 SOAP 结合使用

    我一直在尝试使用 Net Framework 4 7 中的 HTTPClient 对象来创建简单的 SOAP 请求 我已经使用了 Postman 中的参数 它工作得很好 这是我的代码 string url http webservices
  • 在 Java 中获取“外部”IP 地址

    我不太确定如何获取机器的外部 IP 地址 因为网络外部的计算机会看到它 我的以下 IPAddress 类仅获取计算机的本地 IP 地址 public class IPAddress private InetAddress thisIp pr
  • ASP.NET 健康监控 404 事件

    HealthMonitoring 是否有捕获 404 错误的内置事件 我已尝试设置所有事件 通过使用 webBaseEvent 并且搜索了两天 但我无法找到或触发未找到文件的事件 我可以创建自己的活动 但希望有一个内置的活动 不 事实并非如
  • window.onload 似乎在 DOM 加载之前触发(JavaScript)

    我遇到了问题window onload and document onload事件 我读到的所有内容都告诉我 在 DOM 完全加载所有资源之前 这些不会触发 这似乎不会发生在我身上 我在 Chrome 4 1 249 1036 41514
  • Twitter 引导下拉菜单在点击时禁用了按钮的原始功能

    所以我刚刚开始使用引导程序的下拉菜单 这很方便 但我有一个问题 为了让下拉菜单发挥作用 似乎在添加 html 属性时完全禁用了触发下拉的元素 dropdown toggle 的原始功能data toggle dropdown 这是有道理的
  • 如何找到未记录的 .NET / COM 库函数?

    如何找出从某些 NET 函数返回的 COM 对象的属性和方法 而这些函数似乎没有记录 在我正在查看的特定示例中 我使用以下函数将图片插入 Excel 中 Set NewPic ActiveSheet Pictures Insert File
  • 无法确定主机“github.com(192.30.252.128)”的真实性

    我正在尝试使用 sudo npm install 为用 Node js 编写的应用程序安装所有依赖项 我的操作系统是 Ubuntu 13 04 但是 我不断收到此警告 The authenticity of host github com
  • 为什么将演示文稿保存到类似文件的对象会产生空白演示文稿?

    作为回应这个答案 https stackoverflow com a 46980767 1868136对于我之前的问题 我编写了以下简短的程序来尝试重现该问题 from pptx import Presentation from io im
  • 即使调用“SetWindowPos()”后,“SetWindowLong()”函数也不会更改窗口样式

    我使用以下代码创建静态控件 hWnd CreateWindowExW 0 L STATIC Content c str SS LEFT WS VISIBLE WS CHILD SS SUNKEN 200 120 120 40 hWndPar
  • 如何使用 PyUSB 写入控制端点

    我有一个 USB 设备 其代码如下 import usb core import usb util device usb core find idVendor 0xC251 idProduct 0x2201 print device pro