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

使用PyUSB读取485B39设备电压信号时遇NotImplementedError求助

解决Windows 10下PyUSB调用usb.util.claim_interface触发NotImplementedError的问题

针对设备ID29da:000a(DIGITAL ICP USB SIGNAL CONDITIONER Model 485B39)在Windows10+libusbK驱动环境下,调用usb.util.claim_interface抛出NotImplementedError的问题,提供以下排查和解决步骤:

一、确认驱动与PyUSB版本兼容性

  1. 升级PyUSB到最新稳定版:
pip install --upgrade pyusb
  1. 确保安装libusbK 3.0及以上版本,旧版libusbK与PyUSB高层API适配存在问题,可通过Zadig工具查看当前驱动版本。

二、调整代码逻辑,优先使用设备原生接口声明方法

Windows平台下,PyUSB的usb.util.claim_interface高层API可能存在兼容性问题,建议直接调用设备对象的claim_interface方法,同时先完成设备配置:

修改后的示例代码:

import usb.core
import usb.util

# 查找目标设备
dev = usb.core.find(idVendor=0x29da, idProduct=0x000a)
if dev is None:
    raise ValueError("设备未找到,请检查连接和驱动")

# 先设置设备配置(部分设备必须执行此步骤)
try:
    dev.set_configuration()
except usb.core.USBError as e:
    print(f"设置配置失败: {e}")

# 先运行下方注释代码,确认实际接口编号后替换INTERFACE_NUM
# for cfg in dev:
#     for intf in cfg:
#         print(f"接口编号: {intf.bInterfaceNumber}")

INTERFACE_NUM = 0  # 替换为你实际查到的接口编号

# 尝试分离内核驱动
try:
    if dev.is_kernel_driver_active(INTERFACE_NUM):
        dev.detach_kernel_driver(INTERFACE_NUM)
except usb.core.USBError as e:
    print(f"分离驱动失败: {e}")

# 直接调用设备的claim_interface方法
try:
    dev.claim_interface(INTERFACE_NUM)
    print("接口声明成功")
except NotImplementedError as e:
    print(f"接口声明失败: {e}")
    # 备选方案:调用libusb低级API
    try:
        from usb.backend.libusb1 import lib
        lib.libusb_claim_interface(dev.handle, INTERFACE_NUM)
        print("通过libusb低级API声明接口成功")
    except Exception as e:
        print(f"低级API调用失败: {e}")

三、排查设备权限与驱动配置

  1. 右键以管理员身份运行Python脚本,Windows下USB设备操作可能需要管理员权限。
  2. 重新用Zadig安装libusbK驱动时,勾选「Allow non-administrator access」选项,确保普通用户也能访问设备。

四、确认设备接口正确性

运行以下代码枚举设备所有接口和端点,确保使用的接口编号正确:

import usb.core

dev = usb.core.find(idVendor=0x29da, idProduct=0x000a)
for cfg in dev:
    print(f"配置编号: {cfg.bConfigurationValue}")
    for intf in cfg:
        print(f"  接口编号: {intf.bInterfaceNumber}, 设备类: {intf.bInterfaceClass}")
        for ep in intf:
            print(f"    端点地址: {hex(ep.bEndpointAddress)}, 方向: {'输入' if ep.bEndpointAddress & 0x80 else '输出'}")

若设备存在多个接口,尝试切换其他接口编号进行声明。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:22:48