1、winUSB功能介绍

winUSB设备在win10系统下自带驱动程序的,winUSB设备连接到USB后,可以直接被系统识别,无需安装驱动,实现了免驱的功能。就像键盘、鼠标插入到电脑上直接使用一下。

winUSB设备使用BULK传输,具有传输数据量的优点,设备使用BULK IN, BULK OUT,CONTROL3个端点来进行通信。因此winUSB设备在开发USB产品时是一个很好的选择。

2、winUSB软件选型

winUSB软件采用RT thread操作系统自带的USB device协议中 Winusb类驱动,此协议栈已经实现了USB的基本功能,具体代码可以参考分享仓库地址:GitHub - longtengmcu/USB-HOST-driver-4G-rndis-device: STM32F429 USB HOST driver 4G rndis device, Realization of high speed Ethernet data communication。

程序在STM32中运行USB连接到WIN10电脑后是可以直接枚举到的,但是具体进行数据通信时要做软件上的修改。

其中对于winUSB部分代码做了改进:

对于winUSB的read部分函数:修改成读取剩余部分的数据,这样在USB主机发送一包数据后就会立即触发接收回调函数来处理数据,原来的写法是接收到输入缓冲区长度的数据后才什么触发接收回调函数。

对winusb设备端点IN处理流程中增加对发送整最大包数长度数据的处理,即这种情况下发送一个ZLP,0长度包,让主机知道这次传输完成。

到这里,winUSB的驱动部分已经改好了。但是要做USB进行通信还有很多代码要写。

3、winUSB应用程序的编写

winUSB设备在RT THREAD操作系统中注册成winUSB设备,所以对winUSB的读写要使用设备操作的几个函数rt_device_find, rt_device_open, rt_device_read, rt_device_write。感觉跟其他设备一样,但是在实际调试过程中由于底层是USB设备,用法还是有不少区别的,应用时要做很多特殊的处理。

3.1 winUSB设备的初始化

初始化时跟基他设备类型,find,open,注意除了注册接收回调函数外还要注册发送回调函数。最后必须先调用一下rt_device_read()给winUSB设备接收数据时传入接收数据使用的缓冲区,同时启动USB设备接收。

    /* find and open command device */dev_name = “winUSB”client->device = rt_device_find(dev_name);if (client->device){/* using the tx interrupt when uart is RS485 */open_result = rt_device_open(client->device, RT_DEVICE_OFLAG_RDWR);RT_ASSERT(open_result == RT_EOK);rt_device_set_tx_complete(client->device, utc_d_tx_ind);rt_device_set_rx_indicate(client->device, utc_d_rx_ind);client->putc_package = client->utcA_package;/*wait read the winusb device success */while(rt_device_read(client->device, 0, client->putc_package, sizeof(client->utcA_package)) == 0){rt_thread_mdelay(10);}}else{LOG_E("Not find the device(%s).", dev_name);result = -RT_ERROR;}

接收回调函数,USB设备接收到数据后,发送一个信号量给接收数据的线程通知数据处理。这个接收回调函数中使用双缓冲区,让接收数据与处理数据互不干扰。

static rt_err_t utc_d_rx_ind(rt_device_t dev, rt_size_t size)
{utc_d_client_t client = &utc_d_client;if(client->package_len){LOG_W("utc package overwrite!");}client->package_len = size;if(client->putc_package == client->utcA_package){client->putc_package = client->utcB_package;}else{client->putc_package = client->utcA_package;}/*read the usb data next */rt_device_read(dev, 0, client->putc_package, sizeof(client->utcA_package));if(size){/*release the sem */rt_sem_release(client->rx_notice);}return RT_EOK;
}

发送回调函数,usb设备发送成功后会调用发送回调函数,发送一个信号量,通知发送函数已经成功完成发送,这个功能非常重要,否则,USB设备无法正常工作。

static rt_err_t utc_d_tx_ind(rt_device_t dev, void *buffer)
{utc_d_client_t client = &utc_d_client;rt_sem_release(client->tx_notice);return RT_EOK;
}

usb设备发送函数通过rt_device_write函数把数据发送给usb设备驱动后,一定要等待发送完成才行。

static int utc_d_send(utc_d_client_t client, rt_uint8_t *send_data, rt_uint32_t send_len)
{/*send the packet counter    */client->send_packet_counter++;if(rt_device_write(client->device, 0, send_data, send_len) == send_len){/*Must wait the usb send data finish */return rt_sem_take(client->tx_notice, RT_WAITING_FOREVER);}    else{return -RT_ERROR;}}

至此,winUSB设备的应用程序基本功能就全部实现,你可以基于此来进行与上位机的数据通信了。

下期预告,winUSB的调试环境搭建与调试方法。

(8条消息) winUSB设备上位机驱动开发环境的搭建_fhqlongteng的博客-CSDN博客https://blog.csdn.net/fhqlongteng/article/details/124744894?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22124744894%22%2C%22source%22%3A%22fhqlongteng%22%7D&ctrtid=0oU9s

winUSB设备的开发方法相关推荐

  1. winUSB设备上位机驱动开发环境的搭建

    1.winUSB设备开发的环境 本文选择的winUSB的开发语言为python,USB的软件包为pyUSB,首先你需要准备好python的整个开发环境与相关软件,之后在命令行中执行pip instal ...

  2. php+微信开发+解绑,微信开发之解绑设备通知的方法

    本篇文章一起来了解微信开发之解绑设备通知的方法 一开始进行解绑的时候,我一直用的强制解绑设备通知.微信在开发者文档中和接口权限中都没有说明这个接口有次数限制,直到最近两天,解绑一直失败才发现,原来这个 ...

  3. USB开发基础:USB设备的开发流程

    USB设备的开发一般包括主机端(上位机)驱动程序的开发(如果您的USB设备符合某一标准设备类且主机端已经提供了此类设备的驱动程序的话,则可以省掉此步骤)和USB设备端驱动程序的开发,有时还可能包括主机 ...

  4. Windows CE设备驱动开发之电源管理

    4.7电源管理 电源管理模块管理设备电源,从而全面改进操作系统的电源使用效率:它所有设备的电源使用,同时能与不支持电源管理的应用程序及驱动程序共存. 使用电源管理可以有效的减少目标设备的电源消耗,同时 ...

  5. Linux设备驱动开发概述

    作者:宋宝华 email:author@linuxdriver.cn 在过去这些年,Linux已经成功应用于服务器和桌面系统,而近年来,随着嵌入式系统应用的持续升温,Linux也开始广泛应用于嵌入式领 ...

  6. 施釉机器人_一种机器人自动施釉设备的制造方法

    一种机器人自动施釉设备的制造方法 [技术领域] [0001]本发明涉及一种对陶瓷青坯产品进行自动施釉的设备,属于卫生陶瓷生产设备技术领域. [背景技术] [0002]传统的卫生洁具青坯产品在施釉过程中 ...

  7. OO开发思想:面向对象的开发方法(Object oriented,OO)

    面向对象的开发方法(Object oriented,OO)认为是好文章吧,拿来分享一下(转载) 面向对象的开发方法(Object oriented,OO) 从事软件开发的工程 师们常常有这样 的体会: ...

  8. 虚拟字符设备驱动开发步骤

    目录 前言 字符设备驱动简介 内核驱动操作函数集合(file_operations结构体) 字符设备驱动开发步骤 .ko驱动模块的加载和卸载(module_init驱动入口.insmod驱动加载) 字 ...

  9. 《嵌入式设备驱动开发精解》——导读

    前言 嵌入式设备驱动开发精解 本书的编写主要是针对从事嵌入式软件开发人员.本书的内容主要涵盖ARM CPU以及各种常用外部设备驱动开发的方方面面,包括各种硬件接口.硬件接口协议说明以及各种外设的使用及 ...

最新文章

  1. 如何用Dummy实例执行数据库的还原和恢复
  2. IT项目管理总结:第五章 项目范围管理
  3. Oracle 11g客户端及PLSQL Developer配置|Instant Client Setup-64位|OraClientLite11g_x86
  4. go为什么比php性能好,刚学 GO,撸了个支付宝发券的程序,为什么性能还比不上 PHP ?...
  5. 正则表达式 使用分支
  6. android程序的建立,创建第一个Android程序 HelloWorld
  7. 删除同目录下面txt文件(利用os,fnmacth模块)
  8. json react 展示工具_如何基于jsoneditor二次封装一个可实时预览的json编辑器组件?(react版)...
  9. 无产权证的房产能让渡吗?
  10. 山东标梵讲解浅谈移动端开发技术
  11. 札记:Xen是如何工作的?
  12. WCDMA通信技术-CFN SFN
  13. TEST-Mr land cruiser AND open a book for THE GARDEN CITY Mr land cruiserTEST
  14. 凑近一看是地推扫什么码
  15. pandownload,TuTDown网盘不限速下载
  16. win7下编译hyperic hq
  17. 黄帝内经-第40篇-腹中论篇(1)
  18. window 10如何创建虚拟桌面
  19. 嘟嘟投资升级笔记 -- 懂得这几招,投资菜鸟变老鸟
  20. python标准库中文版-Python3标准库 PDF 中文完整版

热门文章

  1. 计算机用户系统软件,系统软件
  2. 支付宝AR红包关闭,看昔日“网红”如何过气
  3. 怎么使用ping命令进行连通性测试
  4. 倾斜摄影超大场景的三维模型轻量化与三维展示效果的关系浅析
  5. 《神经科学:探索脑》学习笔记(第24章 学习和记忆的分子机制)
  6. 正则表达式匹配整行和注释
  7. 第11周编程题在线测试
  8. Typora安装包64位---百度网盘下载
  9. 以一例教你找到【无水印】【高清】【百度图片】的url
  10. 记一次过掉rar未注册版,总是弹出一个烦人的网页对话框的实践