STM32例程之USB HID双向数据传输(源码下载)【转】
程序功能
- 将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的报告描述符:
- const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] =
- {
- 0x05, 0x8c, /* USAGE_PAGE (ST Page) */
- 0x09, 0x01, /* USAGE (Demo Kit) */
- 0xa1, 0x01, /* COLLECTION (Application) */
- // The Input report
- 0x09,0x03, // USAGE ID - Vendor defined
- 0x15,0x00, // LOGICAL_MINIMUM (0)
- 0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
- 0x75,0x08, // REPORT_SIZE (8bit)
- 0x95,0x40, // REPORT_COUNT (64Byte)
- 0x81,0x02, // INPUT (Data,Var,Abs)
- // The Output report
- 0x09,0x04, // USAGE ID - Vendor defined
- 0x15,0x00, // LOGICAL_MINIMUM (0)
- 0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
- 0x75,0x08, // REPORT_SIZE (8bit)
- 0x95,0x40, // REPORT_COUNT (64Byte)
- 0x91,0x02, // OUTPUT (Data,Var,Abs)
- 0xc0 /* END_COLLECTION */
- }; /* CustomHID_ReportDescriptor */
复制代码
上位机测试程序
- /**
- * @brief 发送数据后读取数据
- * @param None
- * @retval None
- */
- void HIDSampleFunc(void)
- {
- HANDLE hDev;
- BYTE recvDataBuf[1024],reportBuf[1024];;
- DWORD bytes;
- hDev = OpenMyHIDDevice(0); // 打开设备,不使用重叠(异步)方式 ;
- if (hDev == INVALID_HANDLE_VALUE){
- printf("INVALID_HANDLE_VALUE\n");
- return;
- }
- reportBuf[0] = 0; // 输出报告的报告 ID 是 0
- for(int i=0;i<REPORT_COUNT;i++){
- reportBuf[i+1]=i+1;//将数据存放在数据缓冲区
- }
- printf("开始写数据到设备...\n");
- // 写入数据到设备,注意,第三个参数值必须为REPORT_COUNT+1,否则会返回1784错误
- if (!WriteFile(hDev, reportBuf, REPORT_COUNT+1, &bytes, NULL)){
- printf("write data error! %d\n",GetLastError());
- return;
- }else{
- printf("成功向设备写出%d个数据... \n",bytes);
- }
- printf("开始从设备读取数据...\n");
- // 从设备读取数据,注意,第三个参数值必须大于等于REPORT_COUNT+1,否则会返回1784错误
- if(!ReadFile(hDev, recvDataBuf, REPORT_COUNT+1, &bytes, NULL)){ // 读取设备发给主机的数据
- printf("read data error! %d\n",GetLastError());
- return;
- }else{
- printf("成功向设备读出%d个数据... \n",bytes);
- }
- printf("设备返回的数据为:\n");
- //显示读取回来的数据
- for(int i=0;i<REPORT_COUNT;i++){
- printf("0x%02X ",recvDataBuf[i+1]);
- }
- printf("\n\r");
- }
复制代码
源码下载
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双向数据传输(源码下载)【转】的更多相关文章
- 74LS164 for stm32 源码下载
在单片机系统中, 如果并行口的IO资源不够,而串行口又没有其他的作用, 那么我们可以用74LS164来扩展并行IO口,节约单片机资源. 74LS164是一个串行输入并行输出的移位寄存器 ...
- spark最新源码下载并导入到开发环境下助推高质量代码(Scala IDEA for Eclipse和IntelliJ IDEA皆适用)(以spark2.2.0源码包为例)(图文详解)
不多说,直接上干货! 前言 其实啊,无论你是初学者还是具备了有一定spark编程经验,都需要对spark源码足够重视起来. 本人,肺腑之己见,想要成为大数据的大牛和顶尖专家,多结合源码和操练编程. ...
- TensorFlow (RNN)深度学习 双向LSTM(BiLSTM)+CRF 实现 sequence labeling 序列标注问题 源码下载
http://blog.csdn.net/scotfield_msn/article/details/60339415 在TensorFlow (RNN)深度学习下 双向LSTM(BiLSTM)+CR ...
- 《编写高质量代码:改善C#程序的157个建议》源码下载
==== 目录 前 言第一部分 语言篇第1章 基本语言要素 / 2建议1:正确操作字符串 / 2建议2:使用默认转型方法 / 6建议3:区别对待强制转型与as和is / 9建议4:TryParse比P ...
- 基于Socket通讯(C#)和WebSocket协议(net)编写的两种聊天功能(文末附源码下载地址)
今天我们来盘一盘Socket通讯和WebSocket协议在即时通讯的小应用——聊天. 理论大家估计都知道得差不多了,小编也通过查阅各种资料对理论知识进行了充电,发现好多demo似懂非懂,拷贝回来又运行 ...
- C# 条形码操作【源码下载】
本篇介绍通过C#生成和读取一维码.二维码的操作. 目录 1. 介绍:介绍条形码.条形码的分类以及ZXing.Net类库. 2. 一维码操作:包含对一维码的生成.读取操作. 3. 二维码操作:包含对二维 ...
- 使用 CSS3 实现 3D 图片滑块效果【附源码下载】
使用 CSS3 的3D变换特性,我们可以通过让元素在三维空间中变换来实现一些新奇的效果. 这篇文章分享的这款 jQuery 立体图片滑块插件,利用了 3D transforms(变换)属性来实现多种不 ...
- 百度地图 api 功能封装类 (ZMap.js) 本地搜索,范围查找实例 [源码下载]
相关说明 1. 界面查看: 吐槽贴:百度地图 api 封装 的实用功能 [源码下载] 2. 功能说明: 百度地图整合功能分享修正版[ZMap.js] 实例源码! ZMap.js 本类方法功能大多使用 ...
- 10款基于jquery的web前端特效及源码下载
1.jQuery时间轴插件:jQuery Timelinr 这是一款可用于展示历史和计划的时间轴插件,尤其比较适合一些网站展示发展历程.大事件等场景.该插件基于jQuery,可以滑动切换.水平和垂直滚 ...
随机推荐
- linux设备驱动第二篇:构造和运行模块
上一篇介绍了Linux驱动的概念,以及linux下设备驱动的基本分类情况及其各个分类的依据和差异,这一篇我们来描述如何写一个类似hello world的简单测试驱动程序.而这个驱动的唯一功能就是输 ...
- codeforces 584E Anton and Ira [想法题]
题意简述: 给定一个$1$到$n(n<=2000)$的初始排列以及最终排列 我们每次可以选取位置为$i$和$j$的 并交换它们的位置 花费为$ |i-j| $ 求从初始状态变换到末状态所需最小花 ...
- sdb报告-10 错误问题定位
# sdb报告-10 错误问题定位在sdb 的集群环境中,如果面对的是一个高并发的操作场景,有时候会莫名其妙地报告 -10 错误. 在 sdb 的错误列表中,-10 错误代表:系统错误. 这是一个笼统 ...
- 如何为mysql建立索引
前些时候,一位颇高级的程序员居然问我什么叫做索引,令我感到十分的惊奇,我想这绝不会是沧海一粟,因为有成千上万的开发者(可能大部分是使用MySQL的)都没有受过有关数据库的正规培训,尽管他们都为客户做过 ...
- 测开之路四十:jQuery基本用法
从cdn引入jQuery库:https://www.bootcdn.cn/,搜索jQuery 在html里面(使用之前计算器的脚本),把复制的标签粘贴到引入js标签的前面:<script src ...
- linux svn 服务器搭建问题
我的svn版本 svn, version 1.7.14 (r1542130) compiled Nov 20 2015, 19:25:09 Copyright (C) 2013 The Apache ...
- Python字符串前缀
1,r/R表示raw string(原始字符串) #!/usr/bin/python str1 = 'hello \n world' str2 = r'hello \n world' print(st ...
- css中的文本字间距离、行距、overflow
css字间距.div css字符间距样式实例1.text-indent设置抬头距离css缩进 div设置css样式text-indent : 20px; 缩进了20px 2.letter-spacin ...
- android 短信发送
- java 调用DB2 SYSPROC.ADMIN_CMD存储过程导出数据
import java.sql.CallableStatement; import java.sql.Connection; import java.sql.DriverManager; import ...