网站首页 文章专栏 使用python开发usb的两种方式(windriver与pyusb)
最近在给一个FPGA板子做上位机界面,上位机与下位机的通信采用USB方案, 驱动采用WinDriver。
但在实际调试过程中,发现WinDriver不同版本之间兼容性差,并且在win10 上表现不佳。实际的数据传输流程如下:
python <-> usb dll(through ctypes) <-> windriver <-> usb device
由于dll文件是在win7机器上编译的,故仅能在win7上使用,在win10机器上出错。
使用python的项目都应该是简洁而优雅地,遂研究了在python操作usb device的两种方式。
驱动无关的调试软件使用bus hound
WinDriver经常与Jungo connectivity联系在一起,安装了WinDriver驱动的usb device在
设备管理器中也显示为Jungo devices
。
完整的WinDriver开发流程应该从驱动开始,使用C/C++调用WinDriver提供的库与usb device 通信,将此程序编译为dll供其他程序调用。
将usb device连接上电脑,使用WinDriver给设备安装驱动。
在python中使用ctypes调用上文中的dll,完成调用过程。
pyusb是一个python库,可以方便地使用python操作usb设备。pyusb的数据传输流程如下:
python <-> pyusb <-> pyusb backend <-> usb device
很明显可以看出省略了dll,大大减少了代码量。
具体使用过程: 1. 下载并安装pyusb backend 2. 连接usb device,使用pyusb backend安装驱动,我选择libusb,一般可以正常使用。不行就换其他的。 3. 编写python脚本,可以参考官方教程
缺点: 1. windriver有一个可视化的调试工具,可以单独发送接收数据以确定usb device是否正常,pyusb暂时没有找到。但 找到了一个非官方的基于tk的pywinusb hid调试工具
我认为官方教程中的操作有些复杂,可以做如下简化:
1. 官方例程中使用get_active_configuration(), usb.util.find_descriptor()
找设备描述符,我没有调试出来且繁杂,不如在 dev.set_configuration()
之后直接dev.write()
,前提是
已经知道设备描述符,这个可以通过一个简单的python脚本查询.
#!/usr/bin/python # 此代码仅供示例,未测试 # 原始链接 http://www.bubuko.com/infodetail-2281652.html import sys import usb.core # find USB devices dev = usb.core.find(find_all=True) # loop through devices, printing vendor and product ids in decimal and hex for cfg in dev: sys.stdout.write('Decimal VendorID=' + str(cfg.idVendor) + ' & ProductID=' + str(cfg.idProduct) + '