0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

winUSB设备的开发方法

RTThread物联网操作系统 来源:未知 2022-12-14 20:10 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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。

1程序在STM32中运行USB连接到WIN10电脑后是可以直接枚举到的,但是具体进行数据通信时要做软件上的修改。
2其中对于winUSB部分代码做了改进:

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

d6566716-7ba4-11ed-8abf-dac502259ad0.png

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

d6754776-7ba4-11ed-8abf-dac502259ad0.png

到这里,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设备的初始化

1初始化时跟基他设备类型,find,open,注意除了注册接收回调函数外还要注册发送回调函数。最后必须先调用一下rt_device_read()给winUSB设备接收数据时传入接收数据使用的缓冲区,同时启动USB设备接收。
 1/*findandopencommanddevice*/
 2dev_name=“winUSB”
 3client->device=rt_device_find(dev_name);
 4if(client->device)
 5{
 6/*usingthetxinterruptwhenuartisRS485*/
 7open_result=rt_device_open(client->device,RT_DEVICE_OFLAG_RDWR);
 8RT_ASSERT(open_result==RT_EOK);
 9rt_device_set_tx_complete(client->device,utc_d_tx_ind);
10rt_device_set_rx_indicate(client->device,utc_d_rx_ind);
11client->putc_package=client->utcA_package;
12/*waitreadthewinusbdevicesuccess*/
13while(rt_device_read(client->device,0,client->putc_package,sizeof(client->utcA_package))==0)
14{
15rt_thread_mdelay(10);
16}
17}
18else
19{
20LOG_E("Notfindthedevice(%s).",dev_name);
21result=-RT_ERROR;
22}

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

		
 1staticrt_err_tutc_d_rx_ind(rt_device_tdev,rt_size_tsize)
 2{
 3utc_d_client_tclient=&utc_d_client;
 4if(client->package_len)
 5{
 6LOG_W("utcpackageoverwrite!");
 7}
 8client->package_len=size;
 9if(client->putc_package==client->utcA_package)
10{
11client->putc_package=client->utcB_package;
12}
13else
14{
15client->putc_package=client->utcA_package;
16}
17/*readtheusbdatanext*/
18rt_device_read(dev,0,client->putc_package,sizeof(client->utcA_package));
19if(size)
20{
21/*releasethesem*/
22rt_sem_release(client->rx_notice);
23}
24returnRT_EOK;
25}

		

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

		
1staticrt_err_tutc_d_tx_ind(rt_device_tdev,void*buffer)
2{
3utc_d_client_tclient=&utc_d_client;
4rt_sem_release(client->tx_notice);
5returnRT_EOK;
6}

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

			
 1staticintutc_d_send(utc_d_client_tclient,rt_uint8_t*send_data,rt_uint32_tsend_len)
 2{
 3/*sendthepacketcounter*/
 4client->send_packet_counter++;
 5if(rt_device_write(client->device,0,send_data,send_len)==send_len)
 6{
 7/*Mustwaittheusbsenddatafinish*/
 8returnrt_sem_take(client->tx_notice,RT_WAITING_FOREVER);
 9}
10else
11{
12return-RT_ERROR;
13}
14}

			
1至此,winUSB设备的应用程序基本功能就全部实现,你可以基于此来进行与上位机的数据通信了。
2下期预告,winUSB的调试环境搭建与调试方法。

			

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

https://club.rt-thread.org/ask/article/691e79f4e05eb0fc.html(请复制至外部浏览器打开)

版权声明:本文为RT-Thread论坛用户「fhqmcu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://club.rt-thread.org/ask/article/691e79f4e05eb0fc.html


RT-Thread开发者大会

我们将联合重量级合作伙伴,围绕AIoT的发展、产业技术趋势,聚焦控制、连接、行业应用开发,通过主题演讲、技术分享、应用演示等环节,助力开发者探索万物智能的世界,期待与大家一起相聚线上直播间!

现在扫码报名 我们将在报名者中抽取“幸运参会者100名” 赠送RT-Thread新款开发板(即将揭秘)

d6952e38-7ba4-11ed-8abf-dac502259ad0.png

本次将在大会当天在直播间宣布中奖名单

更多奖品即将来袭...

原文标题:winUSB设备的开发方法

文章出处:【微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RT-Thread
    +关注

    关注

    32

    文章

    1655

    浏览量

    45411

原文标题:winUSB设备的开发方法

文章出处:【微信号:RTThread,微信公众号:RTThread物联网操作系统】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    探索FT311D开发模块:开启安卓设备USB配件开发新征程

    探索FT311D开发模块:开启安卓设备USB配件开发新征程 在电子设备飞速发展的今天,安卓设备的应用场景日益广泛,而与之配套的USB配件
    的头像 发表于 05-15 15:05 72次阅读

    CDK2000时钟设备开发平台:开启CS2000家族设备评估与编程新体验

    CDK2000时钟设备开发平台:开启CS2000家族设备评估与编程新体验 在电子设备的设计与开发领域,时钟
    的头像 发表于 05-11 15:35 93次阅读

    航空电子设备覆冰测试有哪些方法?需要用到哪些设备?怎么测试?

    航空电子设备覆冰测试是一种在实验室或特定环境中模拟航空电子设备在覆冰条件下的运行状态的测试方法。这种测试的目的是评估航空电子设备在遭受冰雪覆盖时的性能表现,确保其能够在极端天气条件下正
    的头像 发表于 04-16 15:18 225次阅读
    航空电子<b class='flag-5'>设备</b>覆冰测试有哪些<b class='flag-5'>方法</b>?需要用到哪些<b class='flag-5'>设备</b>?怎么测试?

    减少变频器谐波对其它设备影响的方法

    变频器作为现代工业中广泛应用的电力电子设备,其产生的谐波问题已成为影响电能质量和设备安全运行的重要挑战。谐波会导致电网电压畸变、设备过热、继电保护误动作等一系列问题,如何有效抑制变频器谐波对其它
    的头像 发表于 03-12 16:56 415次阅读

    报名开启!2026年开源鸿蒙“北向应用”与“南向设备开发研修班等你加入!

    为深化校企合作,推动开源鸿蒙(OpenHarmony)技术发展,促进高校教师掌握开源鸿蒙北向应用开发和南向设备开发的前沿技术与教学实践方法,提升“双师型”教师队伍建设水平,由高校毕业生
    的头像 发表于 01-08 17:24 1515次阅读
    报名开启!2026年开源鸿蒙“北向应用”与“南向<b class='flag-5'>设备</b>”<b class='flag-5'>开发</b>研修班等你加入!

    速通攻略 | RK3588开发板U-Boot阶段的存储设备文件读取方法

    控制器、多规格USB接口等,为存储设备调试筑牢硬件根基。有了这样强大的硬件支撑,在实际的开发调试与系统验证过程中,对各类存储设备文件内容的读取操作就显得尤为重要。
    的头像 发表于 12-12 08:03 1234次阅读
    速通攻略 | RK3588<b class='flag-5'>开发</b>板U-Boot阶段的存储<b class='flag-5'>设备</b>文件读取<b class='flag-5'>方法</b>

    【免费送书】成为硬核Linux开发者:《Linux 设备驱动开发(第 2 版)》

    Linux系统的设备驱动开发,一直给人门槛较高的印象,主要因内核机制抽象、需深度理解硬件原理、开发调试难度大所致。2021年,一本讲解驱动开发的专著问世即获市场青睐,畅销近万册——这便
    的头像 发表于 11-18 08:06 1941次阅读
    【免费送书】成为硬核Linux<b class='flag-5'>开发</b>者:《Linux <b class='flag-5'>设备</b>驱动<b class='flag-5'>开发</b>(第 2 版)》

    pcm设备故障及处理方法

    。接下来,我将结合具体案例,详细剖析PCM设备常见故障的表现、原因及处理方法,帮助大家在面对设备故障时能够迅速“破案”,恢复通信。 广州邮科PCM复接设备 一、信号全无:线路与接口的“
    的头像 发表于 11-10 10:35 1362次阅读
    pcm<b class='flag-5'>设备</b>故障及处理<b class='flag-5'>方法</b>

    Windows下解决OpenOCD找不到设备及串口无法识别的方法

    。 但有些时候,Windows系统并不能自动安装正确的串口驱动,进而影响到IDE的程序烧写和串口连接功能。另外,有些用户使用PlatformIO IDE进行开发也遇到相似问题,经实验,可尝试用下述方法予以
    发表于 10-20 11:25

    条码扫码设备的使用方法

    使用方法,能让其充分发挥价值,为各行业的规范化管理提供有力支撑。一、条码扫码设备的主要类型不同场景对条码扫码设备的需求存在差异,目前主流类型可分为四类,适配不同工作
    的头像 发表于 09-17 16:15 1229次阅读
    条码扫码<b class='flag-5'>设备</b>的使用<b class='flag-5'>方法</b>

    分享---简单快速实现烘烤设备UI界面的方法

    本文分享下,如何简单快速的设计出工业烘烤设备的UI界面方法, 借助 \"墨刀\" 界面原型设计工具,设计烘烤机主界面图片。 使用拓普微 SGTools开发工具,建立工程和页面
    发表于 08-26 11:58

    知识分享 | 敏捷方法在基于模型的软件开发项目中的应用

    传统的瀑布式软件开发流程存在诸多局限,这使得应用敏捷原则变得尤为重要,尤其是面对复杂且不断变化的开发环境时。作为最高效的软件开发方法之一,基于模型的
    的头像 发表于 07-16 16:52 1487次阅读
    知识分享 | 敏捷<b class='flag-5'>方法</b>在基于模型的软件<b class='flag-5'>开发</b>项目中的应用

    Linux系统查看及修改设备型号信息,触觉智能RK3562开发板演示

    本文介绍Linux系统如何查看及修改设备型号信息的方法,适用于想查看设备型号信息或者想将设备型号信息修改为自己项目的名称的情况。触觉智能RK3562
    的头像 发表于 06-19 15:58 1275次阅读
    Linux系统查看及修改<b class='flag-5'>设备</b>型号信息,触觉智能RK3562<b class='flag-5'>开发</b>板演示

    波峰焊设备的维护和保养方法

    能延长设备使用寿命,还能降低故障发生率,确保生产顺利进行。以下从设备各主要组成部分出发,结合晋力达波峰焊的优势,详细介绍波峰焊设备的维护和保养方法
    的头像 发表于 06-17 17:03 1884次阅读

    开源鸿蒙开发必备!OpenHarmony替换Full SDK全攻略

    本文介绍开源鸿蒙OpenHarmony替换FullSDK的方法,演示设备为触觉智能PurplePiOH鸿蒙开发板获取FullSD
    的头像 发表于 06-06 18:11 1086次阅读
    开源鸿蒙<b class='flag-5'>开发</b>必备!OpenHarmony替换Full SDK全攻略