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设备上位机驱动开发环境的搭建相关推荐

  1. Ubuntu配置上位机Blackfin开发环境手记

    Ubuntu配置上位机Blackfin开发环境手记 -------- 本文档适合使用Ctrl+F 搜索关键字 -------------- -------- It's more convenient ...

  2. 配置上位机软件开发环境BOOST及cmake等

    文章目录 1.安装 Visual Studio 2.安装BOOST 3.安装clion (看喜好IDE ) 4.建立hello world 工程 5.BOOST相关函数 6.MAIN 调用 7.保存成 ...

  3. 本机web开发环境的搭建--nginx篇

    之前写过两篇nginx安装和配置的相关文章: a).Linux下的Nginx安装(开机自启动) b).nginx的配置笔记 我在工作中配置nginx一般用于网页游戏的开发和网站的开发.调试- 而这篇主 ...

  4. 如何制作魔方机器人-01上位机开发环境的搭建

    一.开发环境搭建的流程 0.首先是Win10环境下. 1.Python的安装,这里我使用的是3.7.4版本的Python. 这是Python的官网,请自行下载 https://www.python.o ...

  5. Windows驱动开发环境搭建:VS2013+WDK8.1

    你的Windows驱动开发环境之所以搭建不成功,是因为你没有看这篇博客 1.安装包准备 Visio Studio2013: https://pan.baidu.com/s/1P77yeSKuE7mWl ...

  6. 上位机软件开发项目案例(一)_C#开发

    了解或咨询 上位机软件开发/LabVIEW软件开发/C#软件开发/QT软件开发,请访问AgainDo再度科技官网:www.againdo.com 概述 该软件为线束连接器自动化生产设备上位机软件,系统 ...

  7. Win8.1+VS2013+WDK8.1+VirtualBox or VMware 驱动开发环境配置

    开发Windows驱动,我选择的环境是Win8.1+VS2013+WDK8.1+VirtualBox.理由如下: ①开发机器和测试机器均安装Win8.1,其中开发机器安装的是64位Win8.1,测试机 ...

  8. 驱动开发环境以及双机调试环境搭建

    工作将近三个月了,做了几个项目,想在这里总结一下,方便以后自己或者大家借鉴.最近一个项目里需要做一个文件过滤驱动,我打算把整个过程中遇到的坑和解决方法,总结一下.这篇博客主要帮助大家实现驱动程序的开发 ...

  9. (31)驱动开发环境配置(VS2010+WDK7600)

    本文介绍如何在WIN10配置XP驱动开发环境. 注意,VS2010和WDK都是安装在物理机的. 一.安装VS2010 https://docs.microsoft.com/zh-cn/visualst ...

最新文章

  1. lispbox 安装运行.sh的时候出现 lispbox.sh: 2: lispbox.sh: Bad substitution
  2. python实现ssh登录send_Python实现ssh批量登录并执行命令
  3. 通过url,获取html内容,并解析
  4. solr/solrj原子更新
  5. Android 屏幕尺寸知识
  6. 下一代智能数据工厂,阿里云发布全新DataWorks
  7. python指数运算是不是有问题_为什么在Python 3中复指数运算如此之快?
  8. ThinkPHP5 模型 - 事务支持
  9. 小程序:uniapp开发和原生开发语法区别
  10. 数据寻址——偏移寻址
  11. zk - zookeeper实现配置中心
  12. 使用SpringAOP拦截Feign请求动态添加参数
  13. 企业组织结构中的几种关系
  14. English语法 - 序章(重新认识英语)
  15. Qt事件耦合器实现(类似C#的Prism中的事件耦合器)
  16. element-ui换肤,全局换肤
  17. Android 启动其他应用的Activity或Service失败解决
  18. 二极管与或门和三极管非门电路原理
  19. HDU - 2034 人见人爱A-B 【set】
  20. 使用接口根据关键词取视频列表详情

热门文章

  1. 平均年薪50.8万,数据人拿下这个证书有多香?!
  2. 基于java基于javaweb的管理系统设计与实现怎样选题思路分享
  3. Word——图表如何交叉引用-插入题注-交叉引用
  4. 97年的世界黑客编程大赛第一名的作品-Mekka 【代码+使用】
  5. 《论工业社会及其未来》—泰德.卡辛斯基
  6. knex入门学习使用方法
  7. 视频图像色彩增强的主要方法与落地实践
  8. iOS APP上架流程详解
  9. 88---Python 以符号的方式给出积分表达式,类似Mathematics
  10. 菜孔孔学python--字典