使用PyUSB向USB设备写入时遇超时错误的技术求助
解决PyUSB向USB设备写入SCPI命令超时的问题
首先,我一眼就看到了问题的核心:你用错了端点方向!
错误根源分析
你代码里用dev.write(0x81, msg, 1000)来写数据,但看设备信息里的端点描述:
ENDPOINT 0x81: Interrupt IN ========================== bEndpointAddress : 0x81 IN
0x81是IN端点,它的作用是设备向主机发送数据,主机只能从这个端点读取,根本不能往里面写!这就是为什么会超时——设备完全不会响应这个方向错误的写请求。
正确的端点选择
你的设备有两个可用的输出路径,优先推荐用Bulk端点(更适合SCPI这类ASCII命令传输):
- Interface 1的Bulk OUT端点(0x2):这是专门的应用类接口,Bulk传输更稳定,适合发送SCPI字符串。
- 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
相关产品推荐
相关产品推荐

