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

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库:

  1. 安装库:
    pip install pyusbtmc
    
  2. 测试通信:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 02:20:20