背景

以往项目使用串口通讯,通过空闲超时区分不同数据帧,但Window系统响应非实时,超时间隔不确定导致无法判断是否是完整的一帧数据,同时串口通讯还需要安装对应的驱动包,英文系统、繁体系统等可能安装失败导致用户体验差。USB HID 可以实现免驱(使用中断方式进行数据传输),但通讯速率慢(FS 62.5KB/s 受硬件影响)会64字节分包发送数据,导致上位机很难区分一包完整数据。针对以上存在的问题USB 虚拟串口能很好的提升通讯速率(FS  800KB/S 受硬件影响)但需要安装芯片驱动,针对不同环境可能会导致安装驱动失败问题。WinUsb可以很好的解决以上问题、既能快速通讯、又能即插即用。

WinUsb简介

WCID是WinUsb设备功能的扩展,由Microsoft在Windows8开发人员预览版期间提出,WinUsb自Windows XP SP2以来一直是Windows一部分的功能

WinUsb设备是一种通用串行总线(USB)设备,其固件定义了某些Microsoft操作系统(OS)特征描述符,这些描述符将兼容ID报告为"WINUSB"。WinUsb设备的用途是让Windows将Winusb.sys作为设备的功能驱动程序载入,而无需自定义INF文件。对于WinUsb设备,你无须为设备分发INF文件,这大大简化了驱动程序安装过程。截至2012年5月,从Windows Vista开始的所有平台上都提供了自动 WinUSB WCID 驱动程序。在 Windows 8 或更高版本地系统上已经集成了该驱动程序,这意味着Windows 8 或更高版本地系统上不需要安装驱动程序,系统自动会匹配WinUSB驱动,而对于Vista、Windows7、XP系统,可以通过一些第三方软件(如Zadig)来安装或生成WCID版本的驱动程序,同样只需要安装一次WCID版本的驱动软件,以后所有WCID设备都可以使用该驱动,间接实现了免驱。

WinUsb组成

WinUSB包括两大部分,分别为内核部分和应用层部分:

  1. 内核部分,主要是WinUSB.sys,该内核模式驱动程序,可以作为过滤器或功能驱动程序安装在USB设备的内核模式驱动协议栈中。
  2. 应用层:winusb.dll,其导出函数声名在winusb.h头文件中。当 Winusb.sys 作为设备的功能驱动程序安装时,应用程序可以使用这些功能与它进行通信

WinUsb的版本支持

  1. Windows 7 在基于 x86、基于 x64 和基于 Itanium 的系统上支持 WinUSB。
  2. 较新版本的 Windows 在基于 x86 和基于 x64 的系统上支持 WinUSB。
  3. WinUSB 支持从 Windows 8 开始支持同步传输。

WinUsb限制条件

WinUSB有许多限制条件,一般来说注意以下几点即可

  1. WinUSB不支持Windows 2003 ( 32bit/64bit );
  2. WinUSB不支持Windows XP 64位(可以通过第三方驱动支持);
  3. USB设备版本必需是2.0或2.0以上,WinUSB不支持USB1.0和1.1。

WinUsb通讯速率有多快(USB FS 800KB/S)

我们查看附图1:下载同样的数据WinUsb下载速度是HID的2倍还要多。

通过枚举信息来看 WinUsb Transfer Type : Bulk

设备如何被枚举成WINUSB 设备

WinUsb是在CDC虚拟串口基础上进行实现免驱功能,前期CDC虚拟串口必须通讯正常、方可通过修改枚举成WinUsb设备。关于CDC虚拟串口相关技术这里不做介绍。

WIUSB 设备枚举关键信息

设备枚举成WINUSB的三个关键信息

  1. OS字符串描述符          --判断设备是否支持 WCID设备
  2. 扩展兼容ID OS功能描述符 --判断设备是否为WinUsb设备
  3. 扩展属性OS功能描述符   -- 获取WinUsb设备GUID

支持OS 字符串描述

当有USB设备插入,系统会向设备索取设备描述符。根据设备描述符中的bcdUSB版本号判断是否检索0xEE位置的OS设备字串描述符,如果bcdUSB版本号大于等于2.0,则系统会检索0xEE位置的OS设备字串描述符,支持WinUSB的OS描述如下:

如果0xEE处的OS描述符不存在或者描述格式不正确,系统将设置osvc值为0x0000,表示该USB设备不是WCID设备。如果OS描述正确,系统将osvc设置为0x##。

获取该描述符的作用主要是:判断设备是否WCID设备,如果不是OSVC  赋值0x0000  如果是 OSVC 赋值Vendor Code  主要判断”MSFT100”字符串

设置兼容ID特征描述符

在获取到osvc为有效值的前提下,系统将进一步获取兼容ID特征描述符,索引号为0x04,兼容ID特征描述符包含紧跟一个或多个功能部分的标题部分,具体取决于是否是复合设备。标题部分指定整个描述符的长度、功能部分的数量以及版本号。对于非复合设备,标题后紧跟一个仅与设备的接口关联的功能部分。该部分的compatibleID字段必须指定"WINUSB"作为字段值。复合设备有多个功能部分。每个功能部分的compatibleID字段必须指定"WINUSB"。兼容ID特征描述符格式如下:

扩展属性描述符

最后是添加扩展属性描述符,注册设备接口GUID,包含紧跟一个或多个自定义属性部分的标题部分,索引号为0x05。标题部分描述整个扩展属性描述符,包含其总长度、版本号以及自定义属性部分的数量。WinUSB应用程序正是通过GUID来检索对应的USB设备,并进行访问,详细定义如下表所示:

注意点:

设备枚举过程中,如果以上都进行了修改、但还是出现感叹号 提示枚举失败。

下载PStool工具包、通过管理员身份运行、进入PStool目录

执行:psexec.exe -i -d -s regedit.exe

删除VID、PID之前的枚举信息

市场芯片移植WinUsb对比

  1. STM32(意法半导体芯片) 使用较多、相关文档总结、参考资料多
  2. GD32(兆易国产芯片) WinUsb移植资料几乎没有,驱动库也有点小bug
  3. AT32(雅特力国产芯片) 官方提供了WInUsb例程 入手快

附图1:

雅特力WinUsb、HID下载速度对比:

AT Link WinUSB下载速度提升对比_哔哩哔哩_bilibili

附图2:

使用工具zadig进行安装winusb

以管理员方式运行zadig-2.4.exe,然后在菜单的选择中选择列出所有设备。
这会软件会枚举系统中所有的USB设备,并显示在下列组合对话框中。我们选中我们需要安装winusb的设备,然后点击ReInstallDriver按钮进行安装。
如本人选中一个USB扬声器设备,其信息如下

查看设备的驱动信息:

注册表中的信息如下:

参考:

STM32 WinUSB(WCID)免驱高速通信 20M/s(附详细测试)_bingwueyi的博客-CSDN博客

WinUSB 简介 - USB中文网

https://www.cnblogs.com/yanye0xff/p/16710614.html

GD32移植WinUsb 成功例程如下:

https://download.csdn.net/download/qq_35257512/87838361?spm=1001.2014.3001.5503

STM32移植WinUsb成功例程如下:

https://download.csdn.net/download/qq_35257512/87755345?spm=1001.2014.3001.5503

WinUsb实现USB免驱通讯介绍相关推荐

  1. WinUsb实现USB免驱通讯技术总结

    随着电脑更新换代.USB接口逐渐替代传统接口(串口等),为了更加方便与PC机进行通讯,引入USB通讯. 如何才能实现产品与PC又快又稳定通讯 如何解决串口通讯中接受不定时帧间隔问题 如何实现即插即用的 ...

  2. 用c语言编写rfid读卡系统,USB免驱RFID读写器编程解析之一:智能卡篇

    随着RFID应用的普及,越来越多的软件工程师需要使用RFID读写器编程来实现自己的需求.为了使软件工程师更快的了解RFID读写器的使 用,本文选择一款市面上常用的USB免驱RFID读写器SDT-HA来 ...

  3. usb hid 调试软件_开源USB免驱固件升级软件分享

    跳兔科技开源软件分享,免驱的USB固件升级软件,给您的产品提供无限的活力.加快产品上市速度. 相信做MCU开发的人都免不了要做boot升级功能,产品投入使用中,如果再使用link进行固件更新的话就比较 ...

  4. “摄像头用不了”+win8.1+DELL+外置摄像头+USB免驱的解决办法

    下面是两篇参考文档! 文档1 Win7摄像头驱动错误怎么办https://blog.csdn.net/maoxiaojiemaoxiaojie/article/details/72790118 文档2 ...

  5. ubuntu 安装usb免驱无线网卡TP-LINK WN726N

    先看看我的网卡,这是一款TP-LINK WN726N免驱版无线usb网卡 官方并未提供该版本的linux驱动,但是手边只有这个网卡,于是网上一通搜索终于搞定. 第一步:确定设备所用的驱动 插上无线网卡 ...

  6. 在人脸识别、机器视觉中USB免驱摄像头拍照颜色不对怎么办?大影30~1600万像素多种摄像头方案通过一次白平衡解决偏色问题。

    应用参考: ■工业自动化控制设备:自动生产线上的产品缺陷检测/产品质检/分捡/计数/控制零件装配;电路板焊接检测/自动贴片机高速取料对位/3D立体成像 ■政企工程人脸及静脉指纹识别设备:ATM机/社保 ...

  7. linux usb免驱麦克风,Linux下Skype使用免驱摄像头

    这里的免驱特指在windows下,它在windows下使用v4l2驱动程序,而大多windows自带此驱动,所以在windows下可以叫免驱. Linux下也有v4l2驱动,但它要分64位和32位.如 ...

  8. linux usb免驱麦克风,Android无驱usb音频实现

    实现android系统通过usb麦克风采集声音功能,能够兼容多款anroid设备. 设想方案有两个: 1.采用通过libusb库,直接访问usb驱动,分析usb协议中的音频数据. 2.通过tinyal ...

  9. Win7 64位系统USB免驱设备驱动识别失败解决方法

    插入USB设备,然后打开设备管理器,选择要安装驱动的设备,然后选择计算机的指定位置. 选择c:\windows\winsxs位置或者C:\WINDOWS\SYSTEM32\DRIVERSTORE位置

最新文章

  1. js控制图片的缩放代码示例
  2. iPhone XR XS 底部固定定位偏移解决方案
  3. 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]
  4. 怎样安装python在桌面_在Windows上安装和配置 Jupyter Lab 作为桌面级应用程序教程...
  5. 汇编语言(十三)之偶数转成哥德巴赫猜想
  6. python哪个方向简单_现在学Python,哪个方向最简单?哪个方向最吃香 ?
  7. AttributeError: module 're' has no attribute 'sub'
  8. 泣血推荐丨学编程开始前就该知道的工具集,提升五倍学习效率
  9. 从企业发展的角度来分析做网站的重要性
  10. DOM 精简知识教程
  11. mfc背景图片覆盖控件问题
  12. MapGuide安装
  13. iot软件测试,IoT研发测试工程师
  14. c语言用数组发送大写字母怎么读,【C语言】(数组)C语言字符串中的小写字母转换为大写字母...
  15. 第十二周练兵区——编程题——不计入总分
  16. 全自动反冲洗叠片过滤器
  17. 守望者的逃离 动态规划+滚动数组
  18. 计算机中丢失cg,【计算机中丢失dll文件】计算机丢失dll文件_计算机中丢失cg dll-win7之家...
  19. 新东方老师谈如何学英语
  20. wpt eclipse 使用指南

热门文章

  1. Oauth2.0的安全运行是否必须使用Https协议?官方总结的安全问题有哪些?(附英文文档分析)
  2. 通过《The BIG Talk》对虚拟现实发展的“视频”体验
  3. R语言使用epiDisplay包的summ函数计算dataframe中指定变量在不同分组变量下的描述性统计汇总信息并可视化有序点图、自定义cex.Y.axis参数设置Y轴轴标签字体的大小
  4. 【有奖调研】即时消息服务的产品需求规划就交给你了
  5. vue简单实现移动端视频
  6. ArcGIS engine中Display类库 (局部刷新)
  7. 正则表达式30分钟入门教程、常用正则表达式
  8. 用UNetBootin制作Linux启动盘
  9. 一个开发者账号,多台MAC同时使用
  10. 微信支付-电商收付通开发-06.商户提现