2016-03-14 41 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文件,這些文件是後端與我們需要包含在PATH環境變量中的USB設備進行通信的。

+1

你能解決你的縮進問題嗎?這應該幫助我們找到問題 – maazza

+0

不是它的縮進問題。如果是這樣它應該顯示縮進錯誤。 – dinece

+0

沒有我的意思是你的代碼格式化問題,例如「yield d'」是無效的python – maazza

回答

1

只要我們使用PyUSB模塊與PC的USB通訊則PyUSB模塊將檢查libusb0.dll和libusb的-1.0.dll文件(作爲後端)在PATH environment variableC:\windows\System32位置,然後建立與USB設備通信。由於我使用libusb-win32-wizard創建設備驅動程序,因此它使用libusb0.dll。

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

當我執行上述程序殼牌,我得到的輸出是::

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=Trueusb.core.find()函數它返回連接到PC的每個設備ID。同樣在前4行中,由於我們使用使用libusb0.dll的lib-usb-win32-wizard,因此在第5行提供了INFO:usb.core:find(): using backend "usb.backend.libusb0",這意味着它使用libusb0.dll與USB設備進行通信,因此會出現錯誤。