Gerät auf PyUSB nicht verfügbar
Spielen Sie ein bisschen mit PyUSB herum, um zu sehen, ob es einen Einblick bietet, warum eine von mir verwendete WebUSB-Bibliothek mein Gerät nicht findet. Ich habe libusb1 über Homebrew mit auf dem Mac installiert brew install libusb.
Ran lsusb -vv, um Gerätedetails zu erhalten. Legen Sie außerdem einige Umgebungsvariablen für PyUSB fest:
export PYUSB_LOG_FILENAME=pysubdebug.log und 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
Aus der Protokolldatei geht hervor, dass Python (das sich in einem Venv befindet) eine Datei verwendet, die sich befindet unter /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"
Gebraute Dateien:
$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)
Und bestätigen, dass PyUSB am richtigen Ort sucht:
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
Muss ich eine Funktion erstellen, um eine Bibliothek von Hand anzugeben ? Scheint nicht das Problem zu sein.
Vielleicht fehlt mir ein Konfigurationsschritt.
Antworten
http://USB ist an die Datenübertragung gewöhnt und scheint anfälliger und plattformspezifischer zu sein.
Wenn ich beispielsweise eine Web-App im Allgemeinen in so vielen Browsern laden kann, wie ich möchte, kann ein USB-Gerät nur von einem einzelnen Gerät, einer App (und möglicherweise einem Prozess) "beansprucht" werden.
Ich habe eine (kommerzielle) App namens Serial gefunden , mit der ich (mithilfe der kostenlosen Demo) bestätigen konnte, dass mein Gerät entweder "beansprucht" wird oder nicht.
Einige Apple - Nutzer konnten verwenden kextunloadzu „unclaim“ ein Gerät.
Unter OSX kextstatlieferte die Terminal-App einige Details darüber, welche Kernel welche Geräte beanspruchten:
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...
Aber ich bekam immer wieder die Fehlermeldung, dass sie "in Gebrauch" waren und nicht entladen werden konnten.
Letztendlich habe ich den Computer neu gestartet, wobei das USB-Gerät mit einem guten USB-Kabel direkt angeschlossen wurde, und dank der PyUSB-Tutorial-Dokumente und dieses Beitrags konnte ich zumindest einige Daten mit diesem Code vom Gerät abrufen :
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)
Aussehen:
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])
Erwischt
Als ich zum ersten Mal versuchte, war readdas Timeout zu kurz und / oder der Puffer war zu klein und nachfolgende readAnforderungen kehrten zurück usb.core.USBError: [Errno 32] Pipe error.
Ich stelle mir das vor, weil Python damit beschäftigt war, etwas zu tun, oder weil die Verbindung getrennt werden musste. Die Problemumgehung bestand nur darin, exit()Python zu verwenden und es erneut mit höheren Parametern zu versuchen.