winUSB设备上位机驱动开发环境的搭建
1、winUSB设备开发的环境
本文选择的winUSB的开发语言为python,USB的软件包为pyUSB,首先你需要准备好python的整个开发环境与相关软件,之后在命令行中执行pip install pyusb,即可完成pyusb软件包的安装。pyusb用于实现USB主机端的USB通信功能 。
winUSB设备的开发可以参考:(8条消息) winUSB设备的开发方法_fhqlongteng的博客-CSDN博客https://blog.csdn.net/fhqlongteng/article/details/124705686?spm=1001.2014.3001.5501
2、pyUSB的使用
pyusb的使用很简单,按如下几行代码就是发现USB设备的,可以按PID, VID的方式来查找连接到电脑上的USB设备,此时把winUSB设备连接到电脑上后,运行此代码,正常的情况下,会打印出设备的信息。
import usb.core
import usb.utildev = usb.core.find(idVendor= 0x1234)
if dev is None:raise ValueError('Device not found')
print(dev)
事情不会那么的顺利,我的就遇到了问题,无法正常输出设备信息,单独查看winusb设备在电脑上是枚举成功的。
程序在 运行时报错:usb.core.NoBackendError: No backend available,这是说明pyusb没有找到底层驱动的后端,需要手工增加使用的后端程序libusb-1.0.dll文件,如下方法操作即可。
点击下面的链接下载libusb-1.0.20的压缩包,解压后将MS64\dll\libusb-1.0.dll复制到C:\Windows\System32。如果还不行的话再将同一目录下的libusb-1.0.lib到Python路径下的lib\site-packages\usb文件夹中。
https://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.20/libusb-1.0.20.7z/download
经过以上的操作,就可以正常打印USB设备的信息了。
DEVICE ID 1234:0001 on Bus 002 Address 013 =================bLength : 0x12 (18 bytes)bDescriptorType : 0x1 DevicebcdUSB : 0x200 USB 2.0bDeviceClass : 0x0 Specified at interfacebDeviceSubClass : 0x0bDeviceProtocol : 0x0bMaxPacketSize0 : 0x40 (64 bytes)idVendor : 0x1234idProduct : 0x0001bcdDevice : 0x200 Device 2.0iManufacturer : 0x1 RT-Thread Team.iProduct : 0x2 Lora USBiSerialNumber : 0x3 32021919830108bNumConfigurations : 0x1CONFIGURATION 1: 100 mA ==================================bLength : 0x9 (9 bytes)bDescriptorType : 0x2 ConfigurationwTotalLength : 0x20 (32 bytes)bNumInterfaces : 0x1bConfigurationValue : 0x1iConfiguration : 0x0 bmAttributes : 0xc0 Self PoweredbMaxPower : 0x32 (100 mA)INTERFACE 0: Vendor Specific ===========================bLength : 0x9 (9 bytes)bDescriptorType : 0x4 InterfacebInterfaceNumber : 0x0bAlternateSetting : 0x0bNumEndpoints : 0x2bInterfaceClass : 0xff Vendor SpecificbInterfaceSubClass : 0x0bInterfaceProtocol : 0x0iInterface : 0x0 ENDPOINT 0x1: Bulk OUT ===============================bLength : 0x7 (7 bytes)bDescriptorType : 0x5 EndpointbEndpointAddress : 0x1 OUTbmAttributes : 0x2 BulkwMaxPacketSize : 0x40 (64 bytes)bInterval : 0x0ENDPOINT 0x81: Bulk IN ===============================bLength : 0x7 (7 bytes)bDescriptorType : 0x5 EndpointbEndpointAddress : 0x81 INbmAttributes : 0x2 BulkwMaxPacketSize : 0x40 (64 bytes)bInterval : 0x0
3、USB数据的读写
上面的几行代码仅仅是实现了usb设备的发现,真正要做的是usb数据的读取与写入。此时调试时可以使用BusHould软件在监控usb总线的数据,用于查找解决usb读写过程中的问题。
下面是完整的主机端winusb设备的读写软件:下面代码中向设备发送的数据经过了特定帧格式的编码,winUSB设备接收后解析按此格式的数据进行回复。
import usb.core
import usb.util
import usb.backend.libusb1
import timewinusb = 0x1234
comusb = 0x10c4
mouseusb = 0x46d
dev = usb.core.find(idVendor=winusb)
print(dev)configuration = dev.get_active_configuration()dev.set_configuration()cfg_ = configuration[(0, 0)]# 0x2 写入节点
outPoint = usb.util.find_descriptor(cfg_,# match the first OUT endpointcustom_match=lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_OUT)# 0x81 读取节点
inPoint = usb.util.find_descriptor(cfg_,# match the first IN endpointcustom_match = lambda e: usb.util.endpoint_direction(e.bEndpointAddress) == usb.util.ENDPOINT_IN)#查询版本,型号
msg = [0xa8,0x01,0x02,0x02,0x01,0x00,0x00,0x24]
msg[-1] = sum(msg[1:-1]) & 0xff
r = dev.write(outPoint.bEndpointAddress, msg, 1000)
a= dev.read(inPoint.bEndpointAddress, 1024, 1000)
print("query ack:", end="")
for i in a:print("%02X "%(i),end="")
print("end")#启动接收
msg = [0xa8,0x01,0x03,0x02,0x03,0x00,0x05,0x0F,0x00,0x00,0x00,0x00,0x24]
time_stamp = int(time.time()) + 8*3600
msg[-2] = time_stamp & 0xff
msg[-3] = (time_stamp >> 8) & 0xff
msg[-4] = (time_stamp >> 16) & 0xff
msg[-5] = (time_stamp >> 24)& 0xffmsg[-1] = sum(msg[1:-1]) & 0xff
r = dev.write(outPoint.bEndpointAddress, msg, 1000)
a= dev.read(inPoint.bEndpointAddress, 1024, 1000)
print("start ack:", end="")
for i in a:print("%02X "%(i),end="")
print("end")for j in range(5):try:a= dev.read(inPoint.bEndpointAddress, 1024, 1000)print("read:", end="")for i in a:print("%02X "%(i),end="")print(" end!")except usb.core.USBTimeoutError:passexcept usb.core.USBError:print("usbError")breakexcept Exception as e:print("read error!",e)print("send over")
注意此时需要winUSB的设备配合,设备能正常的向主机发送数据,接收数据,主机侧才能正确的进行读写。如果winUSB设备不能正常的向主机发送数据,主机一直读从机设备数据后,读取不到usb主机会自动复位总线。这个问题的原因是从机不能响应主机读取的数据,主机会停止从机,复位USB总线,希望从机能重新正常来发送数据。
正确的解决办法是检测winusb设备的软件代码,让从机能正常的发送数据给主机就可以了。
Device Phase Data Description Cmd.Phase.Ofs(rep)
------ ----- ------------------------------------------------------------------20.0 CTL 21 0a 00 00 00 00 00 00 SET IDLE 7.1.0 20.0 USTS c0000004 stall pid 7.2.0
4、USB读写异常的处理
dev.read会返回异常,usb.core.USBTimeoutError是超时异常,即没有读到从机的数据,此时可以继续进行读取数据。 usb.core.USBError发生在从机与主机连接断开时,此异常可以识别USB设备断开。
5、产品应用
基于winUSB设备功能实现了lora无线数据协议分析软件,本文以整个软件界面来庆祝winUSB系列博文的结束。
winUSB设备上位机驱动开发环境的搭建相关推荐
- Ubuntu配置上位机Blackfin开发环境手记
Ubuntu配置上位机Blackfin开发环境手记 -------- 本文档适合使用Ctrl+F 搜索关键字 -------------- -------- It's more convenient ...
- 配置上位机软件开发环境BOOST及cmake等
文章目录 1.安装 Visual Studio 2.安装BOOST 3.安装clion (看喜好IDE ) 4.建立hello world 工程 5.BOOST相关函数 6.MAIN 调用 7.保存成 ...
- 本机web开发环境的搭建--nginx篇
之前写过两篇nginx安装和配置的相关文章: a).Linux下的Nginx安装(开机自启动) b).nginx的配置笔记 我在工作中配置nginx一般用于网页游戏的开发和网站的开发.调试- 而这篇主 ...
- 如何制作魔方机器人-01上位机开发环境的搭建
一.开发环境搭建的流程 0.首先是Win10环境下. 1.Python的安装,这里我使用的是3.7.4版本的Python. 这是Python的官网,请自行下载 https://www.python.o ...
- Windows驱动开发环境搭建:VS2013+WDK8.1
你的Windows驱动开发环境之所以搭建不成功,是因为你没有看这篇博客 1.安装包准备 Visio Studio2013: https://pan.baidu.com/s/1P77yeSKuE7mWl ...
- 上位机软件开发项目案例(一)_C#开发
了解或咨询 上位机软件开发/LabVIEW软件开发/C#软件开发/QT软件开发,请访问AgainDo再度科技官网:www.againdo.com 概述 该软件为线束连接器自动化生产设备上位机软件,系统 ...
- Win8.1+VS2013+WDK8.1+VirtualBox or VMware 驱动开发环境配置
开发Windows驱动,我选择的环境是Win8.1+VS2013+WDK8.1+VirtualBox.理由如下: ①开发机器和测试机器均安装Win8.1,其中开发机器安装的是64位Win8.1,测试机 ...
- 驱动开发环境以及双机调试环境搭建
工作将近三个月了,做了几个项目,想在这里总结一下,方便以后自己或者大家借鉴.最近一个项目里需要做一个文件过滤驱动,我打算把整个过程中遇到的坑和解决方法,总结一下.这篇博客主要帮助大家实现驱动程序的开发 ...
- (31)驱动开发环境配置(VS2010+WDK7600)
本文介绍如何在WIN10配置XP驱动开发环境. 注意,VS2010和WDK都是安装在物理机的. 一.安装VS2010 https://docs.microsoft.com/zh-cn/visualst ...
最新文章
- lispbox 安装运行.sh的时候出现 lispbox.sh: 2: lispbox.sh: Bad substitution
- python实现ssh登录send_Python实现ssh批量登录并执行命令
- 通过url,获取html内容,并解析
- solr/solrj原子更新
- Android 屏幕尺寸知识
- 下一代智能数据工厂,阿里云发布全新DataWorks
- python指数运算是不是有问题_为什么在Python 3中复指数运算如此之快?
- ThinkPHP5 模型 - 事务支持
- 小程序:uniapp开发和原生开发语法区别
- 数据寻址——偏移寻址
- zk - zookeeper实现配置中心
- 使用SpringAOP拦截Feign请求动态添加参数
- 企业组织结构中的几种关系
- English语法 - 序章(重新认识英语)
- Qt事件耦合器实现(类似C#的Prism中的事件耦合器)
- element-ui换肤,全局换肤
- Android 启动其他应用的Activity或Service失败解决
- 二极管与或门和三极管非门电路原理
- HDU - 2034 人见人爱A-B 【set】
- 使用接口根据关键词取视频列表详情