玩一玩PyUSB,看看它是否能深入了解为什么我使用的WebUSB库找不到我的设备。我通过带有brew install libusb
的Homebrew在Mac上安装了libusb1。
运行lsusb -vv
以获取设备详细信息。还为PyUSB:设置了几个环境变量
export PYUSB_LOG_FILENAME=pysubdebug.log
和export 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
我需要创建一个函数来手动指定库吗?这似乎不是问题所在。
也许我缺少一个配置步骤。
由于习惯于http://
数据传输,USB似乎更脆弱,而且更特定于平台。
例如,在我通常可以在任意多个浏览器中加载网络应用程序的情况下,USB设备只能是";声称";通过单个设备、应用程序(也许还有进程(。
我找到了一个名为Serial的(商业(应用程序,通过它我可以(使用免费演示(确认我的设备是不是";声称";。
一些苹果用户能够使用CCD_;无人认领";设备。
在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教程文档和这篇文章,我至少能够用以下代码从设备中提取一些数据:
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,然后使用更高的参数重试。