FEIG CPR30+ NFC读卡器PyUSB调用NotImplementedError问题求助
问题原因及解决办法
核心原因分析
- 驱动绑定不兼容:你安装的FEIG官方专用驱动是针对厂商Demo开发的,并非libusb兼容的WinUSB/libusb-win32驱动。PyUSB基于libusb后端时,必须让设备绑定到WinUSB驱动才能正常访问端点、执行USB操作,否则libusb无法获取设备操作权限,触发
NotImplementedError。 - PyUSB使用方式错误:直接调用设备对象(
dev)的write()/read()是旧版用法,当前标准流程是先配置设备、获取对应接口和端点,再通过端点执行读写操作。 - Windows权限限制:普通用户权限下,可能无法直接操作USB设备底层接口,导致方法调用失败。
解决步骤
1. 替换驱动为WinUSB
用Zadig工具将FEIG CPR30+的驱动替换为WinUSB:
- 下载Zadig工具,运行后点击
Options->List All Devices。 - 在列表中找到FEIG CPR30+设备(名称可能含"FEIG"或"CPR30+")。
- 右侧驱动选择框选
WinUSB,点击Replace Driver完成替换(替换后官方Demo可能无法使用,需恢复时可在设备管理器换回原驱动)。
2. 修正PyUSB代码逻辑
不要直接操作设备对象,按标准USB操作流程编写代码:
import usb.core import usb.util # 替换为你的设备实际ID VENDOR_ID = 0x0FE6 PRODUCT_ID = 0x811E # 查找设备 dev = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID) if not dev: print("设备未找到") exit() # 卸载内核驱动(如果设备绑定了厂商驱动) if dev.is_kernel_driver_active(0): try: dev.detach_kernel_driver(0) except usb.core.USBError as e: print(f"卸载内核驱动失败: {str(e)}") # 设置设备配置 try: dev.set_configuration() except usb.core.USBError as e: print(f"设置配置失败: {str(e)}") # 获取激活的配置和目标接口 cfg = dev.get_active_configuration() # 替换为设备实际的接口编号(可通过打印cfg查看) interface = cfg[(0, 0)] # 查找读写端点 ep_out = usb.util.find_descriptor( interface, custom_match=lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_OUT ) ep_in = usb.util.find_descriptor( interface, custom_match=lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_IN ) if not ep_out or not ep_in: print("未找到有效读写端点") exit() # 测试通信(需替换为FEIG读卡器的实际命令格式,参考官方协议) try: test_cmd = b'\x02\x00\x00\x00\x00\x05\xFF\x00\x00\x00\x00' ep_out.write(test_cmd) # 读取响应,长度根据设备协议调整 resp = ep_in.read(64) print(f"收到响应: {resp}") except usb.core.USBError as e: print(f"通信出错: {str(e)}") # 释放设备资源 usb.util.dispose_resources(dev)
3. 提升运行权限
右键点击Python脚本或终端,选择以管理员身份运行,规避Windows权限限制导致的操作失败。
4. 尝试官方SDK(最优方案)
FEIG提供了针对其NFC读卡器的专用SDK(如libFeigNFC),相比PyUSB直接操作USB,官方SDK已封装好所有通信协议和设备操作逻辑,能彻底避免底层USB操作的兼容性问题。可联系FEIG技术支持获取对应Python绑定或C SDK的封装示例。
额外提示
- 查看设备详细信息:运行
print(dev.get_active_configuration())可输出设备的配置、接口、端点信息,帮助确认接口和端点编号是否正确。 - 恢复原驱动:若需使用官方Demo,可在设备管理器找到FEIG设备,右键选择更新驱动程序 -> 浏览我的电脑以查找驱动程序,选择官方驱动文件即可。
内容的提问来源于stack exchange,提问作者ArtyLee
相关产品推荐
相关产品推荐

