设备在PyUSB上不可用

问题描述

稍微试一下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创建函数吗?似乎不是问题所在。

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

解决方法

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

例如,我通常可以在任意数量的浏览器中加载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...

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

最终,我使用 good USB电缆将USB设备直接 插入计算机中,并进行了重新安装,这要感谢PyUSB tutorial docs和{{3} }至少可以使用以下代码从设备中提取一些数据:


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,50,53,56,98,57,99,97,54,13,10])

Gotcha

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

我认为这是因为python忙于尝试做某事或需要断开连接。解决方法只是使用exit() python,然后尝试使用更高的参数。