2016-03-14 10 views
4

Я пытаюсь установить связь между моим ПК и PIC18F4550, но программа не обнаруживает его, а компьютер показывает его в Device Manager.PyUsb не распознает мое устройство USB, пока мой компьютер делает

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, которые являются бэкэндами для связи с USB-устройствами, которые нам необходимо включить в переменную среды PATH.

+1

Вы могли бы исправить свой отступ? это должно помочь нам найти проблему – maazza

+0

нет ее проблемы с отступом. если это так, он должен показывать ошибку отступа. – dinece

+0

Нет, я имею в виду, что ваш код имеет проблемы с форматированием, например, «yield d'» недействителен python – maazza

ответ

1

Всякий раз, когда мы используем модули PyUSB для USB связи с ПК, то модуль PyUSB проверит libusb0.dll и libusb-1.0.dll файлов (которые действуют как бэкэндов) в PATH environment variable и в C:\windows\System32 местах, а затем устанавливает связь с USB-устройствами. Поскольку я использую мастер libusb-win32 для создания драйверов устройств, он использует 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>] 

Так вот с тех пор я дал аргумент поскольку find_all=True в функции usb.core.find() возвращает все идентификаторы устройств, подключенные к ПК. Также в первых 4 строках он дает ошибку, так как мы используем lib-usb-win32-wizard, который использует libusb0.dll и, следовательно, в 5-й строке он дал INFO:usb.core:find(): using backend "usb.backend.libusb0", что означает, что он использует libusb0.dll для связи с USB-устройствами.