pyusb

1、认识pyusb

1-1、usb.core.NoBackendError: No backend available

https://blog.csdn.net/yuanli_best/article/details/85321631

pyusb需要libusb。 已下载:D:\Github\Storage\python\udev\U盘自动拷贝\libusb 示例:D:\Github\Storage\python\udev\U盘自动拷贝\get_udev_info.py

1-2、AttributeError: module 'usb' has no attribute 'backend'

import usb

backend = usb.backend.libusb0.get_backend()
print(backend)

瞎搞,乱试无果。 AttributeError: module 'usb.util' has no attribute 'backend' AttributeError: module 'usb.core' has no attribute 'backend'

第三方库路径:C:\Users\Administrator\Anaconda3\lib\site-packages\usb\core.py

发现有个文件夹backend,里面存在libusb0.py文件。

import usb.backend.libusb0

backend = usb.backend.libusb0.get_backend()
print(backend)

1-3、libusb需要指定寻找路径,否则会去系统目录C:/WINDOWS/SYSTEM32 或者 Python27//Scripts 或者 系统环境变量目录底下找

C:\Users\Administrator\Anaconda3\Lib\site-packages\usb\backend\libusb0.py 文件中get_backend()函数写明:如果没有lib库,就调用_load_library()函数。 _load_library()函数需要使用到入参find_library。

所以此处需要一个自定义的find_library()函数作为参数传入,注意,find_library是个函数!返回值是dll的完整路径。

def find_library(libname):
    libname += '.dll'
    path = None
    osVersion = platform.machine()
    if osVersion.upper() == 'x86'.upper():
        libname = os.getcwd() + '\\libusb\\x86\\' + libname
    elif osVersion.upper() == 'amd64'.upper():
        libname = os.getcwd() + '\\libusb\\amd64\\' + libname
    elif osVersion.upper() == 'ia64'.upper():
        libname = os.getcwd() + '\\libusb\\ia64\\' + libname

    print('libname: ', libname)

    if os.path.exists(libname):
        print('find dll:', libname)
        path = libname

    return path

然后运行结果是:None。

这里是回调函数,不使用是不进去的
backend = usb.backend.libusb0.get_backend(find_library=find_library)
print(backend)
usb.core.find(find_all=True, backend=backend)

由于没有导入库,程序出错,然后被find函数给捕获异常后,导致我前端看不出错误出现在哪里。。。 直接调用find_library函数就可以看见具体的报错。

python执行成功了,但是编译出来的exe运行失败。

2、windows上面使用pyusb有坑

当年踩过坑的路过,反正我是不在windows下用pyusb玩了,我是搞不定了。 我现在的解决方案: 1、在windows下:使用pywinusb库,不过貌似只支持HID设备 2、在Linux(只在ubuntu和raspberry pi 的wheezy)上测试过,使用pyusb。(记得用root)。 其中的USB部分供参考: http://git.oschina.net/jakey.chen/SlaveDebugTool

https://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.20/libusb-1.0.20.7z/download https://sourceforge.net/projects/libusb.mirror/files/v1.0.26/v1.0.26_%20libusb%201.0.26.zip/download

我正在尝试从USB设备读取数据。为此,我使用的是PyUSB,它引发了多个问题。

2-1、错误

使用libusb-win32,找不到设备。在发现它的支持有限之后,我切换到了libusb1 使用libusb1,可以找到一些设备,但是会引发错误 NotImplementedError: Operation not supported or unimplemented on this platform

2-2、建立

import usb.core
import usb.util

# find the USB device
for device in usb.core.find(find_all=True):
    print(device)

使用lbusb0.dll找不到设备,使用libusb-1.0.dll找到设备,但是打印设备会报错:

Traceback (most recent call last):
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\core.py", line 758, in __str__
    for configuration in self:
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\core.py", line 1140, in __iter__
    yield Configuration(self, i)
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\core.py", line 607, in __init__
    configuration
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\backend\libusb1.py", line 775, in get_configurati
    config, byref(cfg)))
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\backend\libusb1.py", line 604, in _check
    raise USBError(_strerror(ret), ret, _libusb_errno[ret])
usb.core.USBError: [Errno 2] Entity not found

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "get_udev_mount_time.py", line 118, in <module>
    debug()
  File "get_udev_mount_time.py", line 95, in debug
    print(dev)
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\core.py", line 762, in __str__
    configuration = self.get_active_configuration()
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\core.py", line 921, in get_active_configuration
    return self._ctx.get_active_configuration(self)
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\core.py", line 113, in wrapper
    return f(self, *args, **kwargs)
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\core.py", line 249, in get_active_configuration
    self.managed_open()
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\core.py", line 113, in wrapper
    return f(self, *args, **kwargs)
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\core.py", line 131, in managed_open
    self.handle = self.backend.open_device(self.dev)
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\backend\libusb1.py", line 804, in open_device
    return _DeviceHandle(dev)
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\backend\libusb1.py", line 652, in __init__
    _check(_lib.libusb_open(self.devid, byref(self.handle)))
  File "C:\Users\Administrator\Anaconda3\lib\site-packages\usb\backend\libusb1.py", line 600, in _check
    raise NotImplementedError(_strerror(ret))
NotImplementedError: Operation not supported or unimplemented on this platform

测试发现,就算使用inf-wizard.exe程序安装了指定设备驱动后还是这样。后来发现,主控是没法打印的,后面修改成U盘设备后正常打印出USB设备信息。 解决方案:去掉8086的vid设备。

3、使用PyUSB获取字符串描述符usb.util.get_string()

按照网上的教程一直报错:NotImplementedError: Operation not supported or unimplemented on this platform

https://blog.csdn.net/weixin_42967006/article/details/108755972

3-1、Error Accessing String

这个问题需要为设备安装WinUSB驱动,点击下面的链接下载Zadig,这是一个Windows平台上专门用于安装USB相关驱动的小软件,下载后可直接运行。 https://udomain.dl.sourceforge.net/project/libusb-win32/libusb-win32-releases/1.2.6.0/libusb-win32-bin-1.2.6.0.zip

软件界面如下图所示,如果当前插入的USB设备都已经安装了驱动(我们常用的键鼠、U盘等都是自动安装了驱动的),这里的设备选择栏里就会没有设备,因为现在显示的是没有安装驱动的USB设备。

点击Option,勾选List All Devices,就可以看到当前所有USB设备,选择想要操作的设备,驱动选择栏选择WinUSB,点击Install Driver即可安装驱动。 !!!注意:更改设备驱动将会导致该设备原来的功能不能使用,所以这里请谨慎操作,最好选择没用的设备或自己开发的USB设备进行测试。

我这边使用这个软件把U盘替换成WinUSB驱动之后,字符串描述符显示正常了。

3-2、usb.util.get_string()获取失败,显示乱码

后来发现,是网上的版本低了,这个函数只需要使用2个参数,而不是3个,即可获取正确的字符串描述符。

4、使用usb.busses获取设备

报错:USBError: [Errno 2] Entity not found

使用 libusb0 驱动程序 (Windows 10),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46458303/。 尴尬的地方在于是不报错了,但是干脆连设备都获取不到了。

结论:行不通,不能使用这种方法获取。

5、向设备写数据

https://blog.csdn.net/u011011827/article/details/119208668

5-1、usb.core.USBTimeoutError: [Errno 10060] Operation timed out

换一个USB口看看是否能解决,我遇到这个问题的时候USB设备插在一个USB扩展器上,直接插到电脑的USB口上就不会报错了。

6、dev.set_configuration()函数

usb.core.USBError: [Errno 19] No such device (it may have been disconnected) 原因可能是:https://github.com/pyusb/pyusb/issues/348

这不重要。

results matching ""

    No results matching ""