设备在 PyUSB 上不可用

Posted

技术标签:

【中文标题】设备在 PyUSB 上不可用【英文标题】:Device Not Available on PyUSB 【发布时间】:2021-02-10 04:17:13 【问题描述】:

玩弄PyUSB 看看它是否提供了一些关于为什么我正在使用的 WebUSB 库找不到我的设备的见解。我用brew install libusb安装了libusb1 on the Mac via Homebrew。

运行lsusb -vv 以获取设备详细信息。还要为 PyUSB 设置几个环境变量:

export PYUSB_LOG_FILENAME=pysubdebug.logexport PYUSB_DEBUG=debug

import usb

VENDOR_ID = 0x0483
PRODUCT_ID = 0x5740
DATA_SIZE = 1

device = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID)

>>> device
<DEVICE ID 0483:5740 on Bus 020 Address 014>

>>> device.is_kernel_driver_active(0)
False

>>> device.set_configuration()
Traceback (abridged)
usb.core.USBError: [Errno 19] No such device (it may have been disconnected)

>>> cfg = device.get_active_configuration()
Traceback (abridged)
usb.core.USBError: [Errno None] Configuration not set

从日志文件看来,python(在 venv 中)正在使用位于 /usr/local/lib/ 的文件:

2020-10-27 12:20:41,706 DEBUG:usb.backend.libusb1:_LibUSB.__init__(<CDLL '/usr/local/lib/libusb-1.0.dylib', handle 7f8ba652c7f0 at 0x1101a5f70>)
2020-10-27 12:20:41,712 INFO:usb.core:find(): using backend "usb.backend.libusb1"

制作的文件:

$brew ls libusb
/usr/local/Cellar/libusb/1.0.23/include/libusb-1.0/libusb.h
/usr/local/Cellar/libusb/1.0.23/lib/libusb-1.0.0.dylib
/usr/local/Cellar/libusb/1.0.23/lib/pkgconfig/libusb-1.0.pc
/usr/local/Cellar/libusb/1.0.23/lib/ (2 other files)
/usr/local/Cellar/libusb/1.0.23/share/libusb/ (13 files)

并确认 PyUSB 正在寻找正确的位置:

ls -l /usr/local/lib/libusb-1.0.dylib
lrwxr-xr-x  #details# /usr/local/lib/libusb-1.0.dylib@ -> ../Cellar/libusb/1.0.23/lib/libusb-1.0.dylib

我需要为Specify a library by hand 创建一个函数吗?好像不是这个问题。

也许我缺少一个配置步骤。

【问题讨论】:

PyUSB 可以找到设备。但是在设置配置时它会失败。设备可能会失败(它可能会返回垃圾,根本不回答,USB 描述符与 SETUP 行为冲突等)。 PID/VID 组合表明它是自定义设备。我认为你应该调查一下设备。 会的。谢谢。 【参考方案1】:

习惯于http:// 数据传输,USB 似乎更脆弱且特定于平台。

例如,我通常可以在任意数量的浏览器中加载 Web 应用程序,而 USB 设备只能由单个设备、应用程序(可能还有进程)“声明”。

我找到了一个名为 Serial 的(商业)应用程序,通过它我可以(使用免费演示)确认我的设备是“已认领”还是未“认领”。

一些Apple users were able to 使用kextunload 来“取消认领”设备。

在 OSX 上,kextstat 终端应用程序产生了一些关于哪些内核声明了哪些设备的详细信息:

kextstat | grep usb
   22    8 0xffffff7f813ec000 0x8000     0x8000     com.apple.driver.usb.AppleUSBCommon (1.0) C2917767-E187-3F86-8E1D-3342A98EF53A <6 5 3 1>
   53    0 0xffffff7f817cf000 0x5000     0x5000     com.apple.driver.usb.AppleUSBHostPacketFilter (1.0) 2569DC26-1911-36D4-9BE3-A727E9535BB2 <23 22 8 7 6 5 3 1>
   54    1 0xffffff7f816a8000 0x56000    0x56000    com.apple.driver.usb.AppleUSBXHCI (1.2) 0E02208C-A8FC-3966-9C74-F09EF887E7E7 <23 22 12 8 7 6 5 3 1>
   etc...

但我不断收到错误消息,提示它们“正在使用”并且无法卸载。

最终我重新启动了计算机,将 USB 设备插入直接,使用 良好 USB 电缆,感谢 PyUSB tutorial docs 和 this post 能够至少使用此代码从设备中提取一些数据:


import usb.core
import usb.util

# got these using the command lsusb -vv
VENDOR_ID = 0x0483
PRODUCT_ID = 0x5740
DATA_SIZE = 1

device = usb.core.find(idVendor=VENDOR_ID, idProduct=PRODUCT_ID)

device.is_kernel_driver_active(0)

device.set_configuration()

device.read(0x81, 255, 1000000)

看:

array('B', [51, 48, 51, 32, 86, 49, 46, 48, 50, 32, 53, 56, 51, 51, 98, 49, 49, 56, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 48, 48, 48, 50, 57, 99, 97, 54, 32, 48, 48, 48, 48, 48, 48, 48, 54, 13, 10])

遇到问题

当我第一次尝试read 时,超时太短和/或缓冲区太小,随后的read 请求将返回usb.core.USBError: [Errno 32] Pipe error

我想这是因为 python 正忙于尝试做某事或需要断开连接。解决方法是 exit() python 并使用更高的参数重试。

【讨论】:

小心尝试卸载随机内核驱动程序。您只想卸载设备的驱动程序,而您上面列出的大多数驱动程序都是用于 USB 主机控制器硬件的,这就是为什么它们正在使用中,卸载它们会使您无法与任何 USB 设备通信。 是的,我只是轻描淡写,半信半疑地认为鼠标和键盘会在某个时候停止工作。您如何确定哪些驱动程序正在驱动哪些设备?

以上是关于设备在 PyUSB 上不可用的主要内容,如果未能解决你的问题,请参考以下文章

Windows 上的 Pyusb - 没有可用的后端

Windows 8.1 上的 Pyusb - 没有可用的后端 - 如何安装 libusb?

GCM 注册:服务在移动网络上不可用

docker-storage-setup 软件包在我的 rhel 7 盒子上不可用?我怎么得到它?我需要使用设备映射器创建一个精简池。

PyUSB 1.0:NotImplementedError:此平台上不支持或未实现的操作

已安装 libusb - 但未找到 pyUSB 后端