You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PyUSB向USB设备写入时遇超时错误的技术求助

解决PyUSB向USB设备写入SCPI命令超时的问题

首先,我一眼就看到了问题的核心:你用错了端点方向!

错误根源分析

你代码里用dev.write(0x81, msg, 1000)来写数据,但看设备信息里的端点描述:

ENDPOINT 0x81: Interrupt IN ==========================
bEndpointAddress : 0x81 IN

0x81是IN端点,它的作用是设备向主机发送数据,主机只能从这个端点读取,根本不能往里面写!这就是为什么会超时——设备完全不会响应这个方向错误的写请求。

正确的端点选择

你的设备有两个可用的输出路径,优先推荐用Bulk端点(更适合SCPI这类ASCII命令传输):

  1. Interface 1的Bulk OUT端点(0x2):这是专门的应用类接口,Bulk传输更稳定,适合发送SCPI字符串。
  2. Interface 0的Interrupt OUT端点(0x1):HID接口的输出端点,但HID通常需要符合报告格式(比如前缀加报告ID),直接发ASCII可能不被识别。

修改后的代码示例

下面是调整后的代码,我优先选用了Bulk接口(Interface 1),这是SCPI设备的常规操作方式:

import usb.core
import usb.util
import sys
import time

# 查找设备
dev = usb.core.find(idVendor=0x1a0d, idProduct=0x15d8)

if dev is None:
    raise ValueError('Ladybug device not found')
else:
    print ("Ladybug device found")

# 分离内核驱动(所有接口都要处理)
for cfg in dev:
    for intf in cfg:
        if dev.is_kernel_driver_active(intf.bInterfaceNumber):
            try:
                dev.detach_kernel_driver(intf.bInterfaceNumber)
            except usb.core.USBError as e:
                sys.exit(f"Could not detach kernel driver from interface({intf.bInterfaceNumber}): {str(e)}")

# 设置配置并声明正确的接口(Interface 1,对应Bulk传输)
dev.set_configuration()
usb.util.claim_interface(dev, 1)

# SCPI命令要转成字节(pyusb需要字节数据)
msg = "*IDN?\r\n"
print(f"writing: {msg}")

# 写入到Bulk OUT端点(0x2)
try:
    written_bytes = dev.write(0x2, msg.encode('ascii'), 1000)
    print(f"Successfully wrote {written_bytes} bytes")
except usb.core.USBError as e:
    print(f"Write error: {str(e)}")

# 从Bulk IN端点(0x82)读取响应,最大包长512字节
print ("reading...")
try:
    data = dev.read(0x82, 512, 1000)
    # 把字节转成ASCII字符串输出
    print(f"Response: {''.join(chr(x) for x in data)}")
except usb.core.USBError as e:
    print(f"Read error: {str(e)}")

# 释放接口(可选,但好习惯)
usb.util.release_interface(dev, 1)

额外注意事项

  • 如果用HID接口(Interface 0)尝试,需要确认设备的HID报告格式:有些HID设备要求每个输出包前面加1字节的报告ID(比如0x00),比如msg = b'\x00' + b'*IDN?\r\n',再用dev.write(0x1, msg, 1000)。但还是优先推荐Bulk接口。
  • 确认SCPI命令的结尾:有些设备只需要\n,但大部分是\r\n,你当前的写法是对的。
  • 树莓派上确保libusb版本是最新的,可以用sudo apt-get update && sudo apt-get install libusb-1.0-0-dev更新。

内容的提问来源于stack exchange,提问作者smiller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 11:07:38