如何向 USB 设备发送消息

Has*_*own 5 usb drivers windows-10

我需要能够向 USB 设备发送一组短字节,但不知道如何发送。
我知道供应商和产品 ID 以及消息字符串(但我需要帮助确定它是 ASCII 字符串还是十六进制字符串)。

有一个叫做usb_modeswitch 的软件似乎可以做到这一点,但它仅限于 Linux。
我在某个地方看到过一个帖子,人们用 mingw 编译了它,但没有提供他们的二进制文件,我自己尝试一下不太舒服。

有人提到使用WinUSB,鉴于其本机包含,这将是理想的选择,但我不知道接口。我确实拥有/可以获得 Visual Studio,但我需要帮助从我在网上看到的内容
中找出要使用的内容。

一个不错的替代方案似乎是带有libusb -win32的PyUSB(usb_modeswitch 使用的端口)。 可以像这样使用写入而不是读取,但我仍然需要知道是否只发送字符串或尝试在调用之前从十六进制表示转换为字节。
write()

这是信息:

DefaultVendor=046d
DefaultProduct=c261
MessageEndpoint=01
ResponseEndpoint=01
TargetClass=0x03
MessageContent="0f00010142"
Run Code Online (Sandbox Code Playgroud)

上下文
如果有帮助的话。

我有一台 Logitech G920,它一直出现故障,它拒绝被识别为我的机器上的设备。

设备和打印机屏幕截图

无需卸载驱动程序、尝试其他 USB 插槽、未通电插入、删除 LGS 即可。但奇怪的是,它仍然可以在我的笔记本电脑和 Xbox 上运行。

当我遇到这个线程时,我正处于放弃并重新格式化我的机器的边缘: 发布截图

果然:

设备管理器截图

这就是我找到这篇文章的地方。一些聪明的人已经在 Linux 上自行解决了这个问题,他们使用软件来要求 USB 调制解调器在驱动程序安装闪存驱动器和互联网提供调制解调器模式之间切换。
上面的信息来自那里,我不知道 的意义'%b/%k',我希望这是一个不必要的 usb_modeswitch 特定的东西。

现在我只需要让它在 Windows 中工作。
谢谢你的帮助。

Has*_*own 3

是的!

我最终选择了 pyusb,因为轮子是一种 HID 设备,所以您需要使用Zadig覆盖驱动程序(libusb-win32这是唯一有效的)。在获得供 python 使用的libusb-win32libusb1.0动态链接库(我不知道是哪一个,我尝试了很多东西)之后,这是有效的代码:

import usb.core
import usb.util
import usb.backend.libusb1
import sys

VENDOR_ID = 0x046D
PRODUCT_ID = 0xC261

BACKEND = usb.backend.libusb1.get_backend(find_library=lambda x: "libusb-1.0.dll")


dev = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID, backend=BACKEND)

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

dev.write(1, '0f00010142'.decode("hex"))
Run Code Online (Sandbox Code Playgroud)

成功