程序功能

  • 将STM32的USB枚举为HID设备。
  • STM32使用3个端点,端点0用于枚举用,端点1和2用于数据的发送和接收。
  • 端点长度为64,也就是单次最多可以传输64个字节数据。
  • STM32获取上位机下发的数据并将该数据通过USB原样返回,同时将数据打印输出。
  • 上位机程序通过调用windows的API实现对HID设备的读写控制。

USB接口原理图:
<ignore_js_op> 
HID枚举成功:
<ignore_js_op> 
程序效果图
<ignore_js_op> 
图一 上位机程序运行图
<ignore_js_op> 
图二  STM32串口打印输出
<ignore_js_op> 
图三 Bus Hound抓取的数据
程序部分代码
STM32的报告描述符:

  1. const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
  2. {
  3. 0x05, 0x8c, /* USAGE_PAGE (ST Page) */
  4. 0x09, 0x01, /* USAGE (Demo Kit) */
  5. 0xa1, 0x01, /* COLLECTION (Application) */
  6. // The Input report
  7. 0x09,0x03, // USAGE ID - Vendor defined
  8. 0x15,0x00, // LOGICAL_MINIMUM (0)
  9. 0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
  10. 0x75,0x08, // REPORT_SIZE (8bit)
  11. 0x95,0x40, // REPORT_COUNT (64Byte)
  12. 0x81,0x02, // INPUT (Data,Var,Abs)
  13. // The Output report
  14. 0x09,0x04, // USAGE ID - Vendor defined
  15. 0x15,0x00, // LOGICAL_MINIMUM (0)
  16. 0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
  17. 0x75,0x08, // REPORT_SIZE (8bit)
  18. 0x95,0x40, // REPORT_COUNT (64Byte)
  19. 0x91,0x02, // OUTPUT (Data,Var,Abs)
  20. 0xc0 /* END_COLLECTION */
  21. }; /* CustomHID_ReportDescriptor */

复制代码

上位机测试程序

  1. /**
  2. * @brief  发送数据后读取数据
  3. * @param  None
  4. * @retval None
  5. */
  6. void HIDSampleFunc(void)
  7. {
  8. HANDLE       hDev;
  9. BYTE         recvDataBuf[1024],reportBuf[1024];;
  10. DWORD        bytes;
  11. hDev = OpenMyHIDDevice(0); // 打开设备,不使用重叠(异步)方式 ;
  12. if (hDev == INVALID_HANDLE_VALUE){
  13. printf("INVALID_HANDLE_VALUE\n");
  14. return;
  15. }
  16. reportBuf[0] = 0; // 输出报告的报告 ID 是 0
  17. for(int i=0;i<REPORT_COUNT;i++){
  18. reportBuf[i+1]=i+1;//将数据存放在数据缓冲区
  19. }
  20. printf("开始写数据到设备...\n");
  21. // 写入数据到设备,注意,第三个参数值必须为REPORT_COUNT+1,否则会返回1784错误
  22. if (!WriteFile(hDev, reportBuf, REPORT_COUNT+1, &bytes, NULL)){
  23. printf("write data error! %d\n",GetLastError());
  24. return;
  25. }else{
  26. printf("成功向设备写出%d个数据... \n",bytes);
  27. }
  28. printf("开始从设备读取数据...\n");
  29. // 从设备读取数据,注意,第三个参数值必须大于等于REPORT_COUNT+1,否则会返回1784错误
  30. if(!ReadFile(hDev, recvDataBuf, REPORT_COUNT+1, &bytes, NULL)){ // 读取设备发给主机的数据
  31. printf("read data error! %d\n",GetLastError());
  32. return;
  33. }else{
  34. printf("成功向设备读出%d个数据... \n",bytes);
  35. }
  36. printf("设备返回的数据为:\n");
  37. //显示读取回来的数据
  38. for(int i=0;i<REPORT_COUNT;i++){
  39. printf("0x%02X ",recvDataBuf[i+1]);
  40. }
  41. printf("\n\r");
  42. }

复制代码

源码下载
STM32程序下载: <ignore_js_op> stm32_usb_hid.zip 
STM32F105/107版本源码下载: <ignore_js_op> usb_hid.rar 
HID上位机程序下载(VS2010): <ignore_js_op> STM32_HID_PC_Driver.zip
HID上位机程序下载(VS2008): <ignore_js_op> PC_HID.zip )

USB开发相关资料下载
<ignore_js_op> USB2.0技术规范(中文).pdf
<ignore_js_op> Windows主机端与自定义USB_HID设备通信详解.pdf 
<ignore_js_op> STM32F10xxx USB-FS-Device firmware library.pdf 
<ignore_js_op> STM32F10xxx USB开发工具包.pdf 
<ignore_js_op> STM32_USB-FS-Device_Lib_V3.0.1.zip 
<ignore_js_op> STM32_usb固件库.pdf 
<ignore_js_op> 基于STM32的USB程序开发笔记.pdf 
<ignore_js_op> 深入解析STM32_USB-FS-Device_Lib库.pdf

出处:http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=199&extra=&page=1

STM32例程之USB HID双向数据传输(源码下载)【转】的更多相关文章

  1. 74LS164 for stm32 源码下载

      在单片机系统中, 如果并行口的IO资源不够,而串行口又没有其他的作用, 那么我们可以用74LS164来扩展并行IO口,节约单片机资源.       74LS164是一个串行输入并行输出的移位寄存器 ...

  2. spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)

    不多说,直接上干货! 前言   其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...

  3. TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载

    http://blog.csdn.net/scotfield_msn/article/details/60339415 在TensorFlow (RNN)深度学习下 双向LSTM(BiLSTM)+CR ...

  4. 《编写高质量代码:改善C#程序的157个建议》源码下载

    ==== 目录 前 言第一部分 语言篇第1章 基本语言要素 / 2建议1:正确操作字符串 / 2建议2:使用默认转型方法 / 6建议3:区别对待强制转型与as和is / 9建议4:TryParse比P ...

  5. 基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)

    今天我们来盘一盘Socket通讯和WebSocket协议在即时通讯的小应用——聊天. 理论大家估计都知道得差不多了,小编也通过查阅各种资料对理论知识进行了充电,发现好多demo似懂非懂,拷贝回来又运行 ...

  6. C# 条形码操作【源码下载】

    本篇介绍通过C#生成和读取一维码.二维码的操作. 目录 1. 介绍:介绍条形码.条形码的分类以及ZXing.Net类库. 2. 一维码操作:包含对一维码的生成.读取操作. 3. 二维码操作:包含对二维 ...

  7. 使用 CSS3 实现 3D 图片滑块效果【附源码下载】

    使用 CSS3 的3D变换特性,我们可以通过让元素在三维空间中变换来实现一些新奇的效果. 这篇文章分享的这款 jQuery 立体图片滑块插件,利用了 3D transforms(变换)属性来实现多种不 ...

  8. 百度地图 api 功能封装类 (ZMap.js) 本地搜索,范围查找实例 [源码下载]

    相关说明 1. 界面查看: 吐槽贴:百度地图 api 封装 的实用功能 [源码下载] 2. 功能说明: 百度地图整合功能分享修正版[ZMap.js] 实例源码! ZMap.js 本类方法功能大多使用 ...

  9. 10款基于jquery的web前端特效及源码下载

    1.jQuery时间轴插件:jQuery Timelinr 这是一款可用于展示历史和计划的时间轴插件,尤其比较适合一些网站展示发展历程.大事件等场景.该插件基于jQuery,可以滑动切换.水平和垂直滚 ...

随机推荐

  1. Python游戏

    要想实现键盘控制作用,就需要给游戏键盘监听事件利用pygame模块的key.get_pressed()方法,来检测按键是否按下 key_press =pygame.key.get_pressed() ...

  2. Spring Boot学习一之配置类及自动配置

    一.配置类 1. 导入其他配置类 你不需要将所有的 @Configuration 放进一个单独的类, @Import 注解可以用来导入其他配置类.另外,你也可以使用 @ComponentScan 注解 ...

  3. 请教怎么查询ORACLE的历史操作记录!

    请问如何查询ORACLE的历史操作记录!!!!!我用的是linux oracle 11g r2,想查一下前几天的数据库的历史操作记录,例如对表的insert,delete,update等等的操作记录, ...

  4. 题解 SP4033 【PHONELST - Phone List】

    水一发trie板子~ 先说这个题怎么套上板子 首先我们判断是否有前缀可以边插入边判断 当我们经过了一个完整的字符串(即当前节点到了一个有标记的节点上) 就是有前缀 我们当然也可以无脑先判断一发(比如我 ...

  5. 测开之路十六:@classmethod与@staticmethod

    @classmethod 类方法 和属性一样,所有实例化的对象都共享类方法 @staticmethod 静态方法,可以理解为和类没有任何关系,只是放在了类里面 参数可以任意定义,根据自己的定义传参,也 ...

  6. spring boot 尚桂谷学习笔记07 嵌入式容器 ---Web

    ------配置嵌入式servlet容器------ springboot 默认使用的是嵌入的Servlet(tomcat)容器 问题? 1)如何定制修改Servlet容器的相关配置: 1.修改和se ...

  7. USACO 6.3 章节 你对搜索和剪枝一无所知QAQ

    emmm........很久很久以前 把6.2过了 所以emmmmmm 直接跳过 ,从6.1到6.3吧 Fence Rails 题目大意 N<=50个数A1,A2... 1023个数,每个数数值 ...

  8. Oralce分页

    SELECT *FROM ( SELECT TMP_PAGE.*, ROWNUM ROW_ID FROM ( SELECT A . ID AS "id", A .bill_noti ...

  9. vue如何配置路由 、获取路由的参数、部分刷新页面、缓存页面

    vue如何配置路由 .获取路由的参数.部分刷新页面.缓存页面:http://www.mamicode.com/info-detail-1941546.html vue-router传递参数的几种方式: ...

  10. 常用缓存淘汰算法(LFU、LRU、ARC、FIFO、MRU)

    缓存算法是指令的一个明细表,用于决定缓存系统中哪些数据应该被删去. 常见类型包括LFU.LRU.ARC.FIFO.MRU. 最不经常使用算法(LFU): 这个缓存算法使用一个计数器来记录条目被访问的频 ...