PyUSB连接Agilent E4980A超时问题求助
解决PyUSB与Agilent E4980A通信的USBTimeoutError问题
问题背景
在Windows 10、Python 3.11.3、libusb-1.0 v1.0.26.11724、PyUSB v1.2.1环境下,使用PyUSB与Agilent E4980A通信时,替换libusbK驱动后仍出现USBTimeoutError,但同款脚本可正常与OWON P1337示波器通信。
解决方案
1. 验证设备端点配置
首先确认你使用的是正确的USBTMC批量端点,而非控制端点。通过以下代码打印设备的接口和端点信息:
import usb.core # 替换为Agilent E4980A的VID和PID,可通过设备管理器获取 VID = 0x0957 PID = 0x0909 dev = usb.core.find(idVendor=VID, idProduct=PID) if dev is None: raise ValueError("Device not found") # 遍历配置、接口、端点 for cfg in dev: print(f"配置编号: {cfg.bConfigurationValue}") for intf in cfg: print(f" 接口编号: {intf.bInterfaceNumber}, 接口类: {intf.bInterfaceClass}") # USBTMC的接口类应为0xFF(自定义)或0xFE(应用特定) for ep in intf: # 端点类型:0=控制, 1=批量, 2=中断, 3=等时 ep_type = ep.bmAttributes & 0x3 dir_in = ep.bEndpointAddress & 0x80 print(f" 端点地址: 0x{ep.bEndpointAddress:02X}, 类型: {'批量' if ep_type ==1 else '其他'}, 方向: {'IN' if dir_in else 'OUT'}")
确保你使用的是批量OUT端点发送命令,批量IN端点接收响应。
2. 调整超时与命令格式
- 增加超时时间:默认超时可能不足以让E4980A返回响应,发送和接收时指定
timeout=10000(10秒):# 假设已获取正确的out_ep和in_ep端点对象 dev.write(out_ep, b"*IDN?\n", timeout=10000) resp = dev.read(in_ep, 1024, timeout=10000) print("响应:", resp.tobytes().decode()) - 确认命令结尾:Agilent仪器通常要求命令以
\n结尾,部分设备支持\r\n,确保格式正确。
3. 使用USBTMC专用库
直接用PyUSB手动实现USBTMC协议容易出错,推荐使用封装好的pyusbtmc库:
- 安装库:
pip install pyusbtmc - 测试通信:
import usbtmc instr = usbtmc.Instrument(VID, PID) # 查询设备标识 print(instr.query("*IDN?"))
该库已处理USBTMC的握手、端点选择等细节,兼容性更好。
4. 更换libusb驱动版本
尝试切换到libusb-win32驱动(在Zadig中选择"libusb-win32"选项),部分Agilent仪器对不同libusb驱动的兼容性存在差异。更换驱动后重启电脑再测试。
5. 检查设备USB模式设置
进入Agilent E4980A的系统菜单,确认USB通信模式设置为USBTMC仪器控制模式,避免误设为U盘存储模式等其他USB功能。
内容的提问来源于stack exchange,提问作者theozh
相关产品推荐
相关产品推荐

