2017-01-25 193 views
0

我試圖與具有賽普拉斯FX-2 USB控制器的AD9913評估板(ADI公司)進行通信。我編寫了一個功能齊全的Python庫,可以在Windows 7上完美地工作(使用通過libusb-win32-1.2.6.0的inf-wizard.exe生成的驅動程序),但現在我嘗試從Raspberry Pi 3運行相同的軟件, Raspbian Jessie似乎無法書寫或閱讀。pyusb - Linux上的[錯誤5],但不是Windows

下面的小例子,可以在Windows 7:

import os 
os.environ['PYUSB_DEBUG'] = 'debug' 

import usb.core 
print "usb.core file:", usb.core.__file__ 

# get device 
dev = usb.core.find(idVendor=0x0456, idProduct=0xEE25) 
if dev is None: 
    raise ValueError("Device not found") 
dev.set_configuration() 

# get the firmware version 
print "Write: ", dev.write(0x01, [0x00]) 
print "Read: ", dev.read(0x81, 7) 

的輸出中這裏是:

usb.core file: C:\Python27\lib\site-packages\usb\core.pyc 
Write: 1 
Read: array('B', [1, 0]) 

然而,覆盆子出現幾個問題。一,產品ID是0xEE24(我發現了通過dmesg的),和第二,該代碼例如以上給出

usb.core file: /usr/local/lib/python2.7/dist-packages/usb/core.pyc 
Write: 
Traceback (most recent call last): 
    File "usbtesting_minimal_linux.py", line 29, in <module> 
     print "Write: ", dev.write(0x01, [0x00]) 
    File "/usr/local/lib/python2.7/dist-packages/usb/core.py", line 948, in write 
self.__get_timeout(timeout) 
    File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 824, in bulk_write 
timeout) 
    File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 920, in __write 
_check(retval) 
    File "/usr/local/lib/python2.7/dist-packages/usb/backend/libusb1.py", line 595, in _check 
    raise USBError(_strerror(ret), ret, _libusb_errno[ret]) 
usb.core.USBError: [Errno 5] Input/Output Error 

我通過調用sudo python minimal_example.py執行腳本,否則(如預期)我得到usb.core.USBError: [Errno 13] Access denied (insufficient permissions)。 (對於上述測試,我刪除了我添加的允許訪問我的常規用戶帳戶的udev規則,然後重新啓動並重新插入設備。)

我還注意到,在Windows上,Configuration 1(這是唯一的配置)加入

cfg = dev.get_active_configuration() 

到上述示例腳本所揭示的,僅具有一個Interface 0,其中如在Linux Interface 0沒有端點,但有附加接口Interface 0, 1Interface 0, 2Interface 0,3,其中第一個是相同的Windows顯示的唯一界面。

按照in this post的說明分離內核驅動程序 - 這在目前不需要USB驅動程序的情況下給予我當前的理解 - 並不能解決問題。

我懷疑這個問題源於USB通信的Windows/libusb和Linux實現/後端之間的區別(已經暗示了所附的產品ID與所附的硬件完全不同的事實)這可能需要對寫入USB端點的方式進行一些更改。

如果需要,我很樂意提供更多信息,並歡迎提供所有提示和建議。

回答

0

雖然我仍然無法與樹莓派上的設備進行通信,但通過明確地選擇具有適當端點的合適替代設置來解決錯誤5問題,例如,

dev.set_interface_altsetting(interface = 0, alternate_setting = 1) 

然後讀/寫請求不再失敗並Error 5,但與超時錯誤(這是爲Error 110libusb1Nonelibusb0)。

我現在懷疑操作系統檢測到設備時存在問題,因爲不僅Windows和Linux之間的productID發生了變化,而且我對感興趣的端點的wMaxPacketSize也給出了64字節在Windows上是512字節,在Linux上是512字節。

一旦我進一步解決問題,我會打開一個新問題,並將該鏈接添加爲對此答案的評論(或者在此處發佈整個解決方案以防萬一我可以立即解決問題)。

相關問題