PyUsb 无法识别我的 USB 设备,而我的 PC 可以

Posted

技术标签:

【中文标题】PyUsb 无法识别我的 USB 设备,而我的 PC 可以【英文标题】:PyUsb does not recognize my USB device while my PC does 【发布时间】:2016-06-29 04:20:36 【问题描述】:

我正在尝试在我的 PC 和 PIC18F4550 之间进行通信,但程序没有检测到它,而计算机在 Device Manager 中显示它。

import usb.core

dev = usb.core.find(idVendor = 0x04D8, idProduct = 0xFEAA)

检查USB设备的功能:

def find(find_all = False, backend = None, custom_match = None, **args):
    def device_iter(k, v):
        for dev in backend.enumerate_devices():
            d = Device(dev, backend)
            if  _interop._reduce(lambda a, b: a and b,map(operator.eq,v,map(lambda i:getattr(d,i),k)),True)and (custom_match is None or custom_match(d)):
                yield d
        if backend is None:
            import usb.backend.libusb1 as libusb1
            import usb.backend.libusb0 as libusb0
            import usb.backend.openusb as openusb

            for m in (libusb1, openusb, libusb0):
                backend = m.get_backend()
                if backend is not None:
                    _logger.info('find(): using backend "%s"', m.__name__)
                       break
                 else:
                    raise ValueError('No backend available')

        k, v = args.keys(), args.values()

        if find_all:
            return device_iter(k, v)
        else:
            try:
                return _interop._next(device_iter(k, v))
            except StopIteration:
                return None

我在运行代码时遇到的错误。

Traceback (most recent call last):
 File "C:\modules\motor.py", line 29, in <module>
   dev = usb.core.find(idVendor=0x04D8,idProduct=0xFEAA)
 File "C:\Python27\lib\site-packages\usb\core.py", line 1199, in find
   raise ValueError('No backend available')
 ValueError: No backend available

之前它可以正常执行,但在过去的几天里它显示了这个错误。我不明白突然发生了什么。使用 PyUSB 模块有什么问题吗?

我看到他们中的一些人在使用 USB 通信时遇到了同样的问题。


我已经解决了这个问题。解决方案是 PyUSB 模块将搜索 libusb0.dll 和 libusb-1.0.dll 文件,它们是与我们需要包含在 PATH 环境变量中的 USB 设备通信的后端。

【问题讨论】:

你能修复你的缩进吗?这应该可以帮助我们找到问题 不,这不是缩进问题。如果是这样,它应该显示缩进错误。 不,我的意思是你的代码有格式问题,例如“yield d`”是无效的python 这不是我的代码的一部分。我用它来构建***中的代码 是的,但是任何想帮助您的人都会尝试复制您的代码,如果您的示例在这里排版正确,这会更容易 【参考方案1】:

每当我们使用 PyUSB 模块与 PC 进行 USB 通信时,PyUSB 模块都会检查 PATH environment variable 中的 libusb0.dll 和 libusb-1.0.dll 文件(充当后端) strong>C:\windows\System32 定位,然后与 USB 设备建立通信。由于我使用 libusb-win32-wizard 创建设备驱动程序,因此它使用 libusb0.dll。执行过程可以通过以下DEBUG程序找到:

import os
os.environ['PYUSB_DEBUG'] = 'debug'
import usb.core
print list(usb.core.find(find_all=True))

当我在Shell中执行上述程序时,我得到的输出是:

2016-03-26 11:41:44,280 ERROR:usb.libloader:'Libusb 1' could not be found
2016-03-26 11:41:44,280 ERROR:usb.backend.libusb1:Error loading libusb 1.0 backend
2016-03-26 11:41:44,280 ERROR:usb.libloader:'OpenUSB library' could not be found
2016-03-26 11:41:44,280 ERROR:usb.backend.openusb:Error loading OpenUSB backend
2016-03-26 11:41:44,280 INFO:usb.core:find(): using backend "usb.backend.libusb0"
2016-03-26 11:41:44,280 DEBUG:usb.backend.libusb0:_LibUSB.enumerate_devices()
2016-03-26 11:41:44,296 DEBUG:usb.backend.libusb0:_LibUSB.get_device_descriptor(<usb.backend.libusb0._usb_device object at 0x0200E530>)
2016-03-26 11:41:44,296 DEBUG:usb.backend.libusb0:_LibUSB.get_device_descriptor(<usb.backend.libusb0._usb_device object at 0x0200E5D0>)
2016-03-26 11:41:44,296 DEBUG:usb.backend.libusb0:_LibUSB.get_device_descriptor(<usb.backend.libusb0._usb_device object at 0x0200E6C0>)
2016-03-26 11:41:44,296 DEBUG:usb.backend.libusb0:_LibUSB.get_device_descriptor(<usb.backend.libusb0._usb_device object at 0x0200E7B0>)
2016-03-26 11:41:44,296 DEBUG:usb.backend.libusb0:_LibUSB.get_device_descriptor(<usb.backend.libusb0._usb_device object at 0x0200E8A0>)
2016-03-26 11:41:44,296 DEBUG:usb.backend.libusb0:_LibUSB.get_device_descriptor(<usb.backend.libusb0._usb_device object at 0x0200E990>)
2016-03-26 11:41:44,296 DEBUG:usb.backend.libusb0:_LibUSB.get_device_descriptor(<usb.backend.libusb0._usb_device object at 0x0200EA80>)
2016-03-26 11:41:44,296 DEBUG:usb.backend.libusb0:_LibUSB.get_device_descriptor(<usb.backend.libusb0._usb_device object at 0x0200EB70>)
[<DEVICE ID 046d:c05a on Bus 000 Address 001>, <DEVICE ID 046d:c31d on Bus 000 Address 002>, <DEVICE ID 046d:c31d on Bus 000 Address 003>, <DEVICE ID 046d:c31d on Bus 000 Address 004>, <DEVICE ID 04d8:feaa on Bus 000 Address 005>, <DEVICE ID 046d:082b on Bus 000 Address 006>, <DEVICE ID 046d:082b on Bus 000 Address 007>, <DEVICE ID 046d:082b on Bus 000 Address 008>]

因此,由于我在usb.core.find() 函数中将参数设为find_all=True,因此它返回每个连接到PC 的设备ID。同样在前 4 行它给出了错误,因为我们使用了 lib-usb-win32-wizard,它使用了 libusb0.dll,因此在第 5 行它给出了INFO:usb.core:find(): using backend "usb.backend.libusb0",这意味着它正在使用 libusb0.dll 与 USB 设备进行通信。

【讨论】:

以上是关于PyUsb 无法识别我的 USB 设备,而我的 PC 可以的主要内容,如果未能解决你的问题,请参考以下文章

PyUSB:从 USB 设备读取

Windows 7 上的 Pyusb 找不到任何设备

Windows 10 上与 python PyUSB 的简单通信 USB

我的usb设备总是会被识别为libusb-win32 devices

PyUSB 后端无法访问

手机USB插入电脑后电脑无法识别