纬图虚拟仪器论坛

 找回密码
 立即注册
搜索
查看: 758040|回复: 186

STM32例程之USB HID双向数据传输(源码下载)

  [复制链接]
发表于 2012-8-15 19:19:39 | 显示全部楼层 |阅读模式
本帖最后由 wdluo 于 2015-8-21 18:15 编辑

程序功能


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

1.jpg
图一 上位机程序运行图
2.jpg
图二  STM32串口打印输出
3.jpg
图三 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.         
  7.         // The Input report
  8.         0x09,0x03, // USAGE ID - Vendor defined
  9.         0x15,0x00, // LOGICAL_MINIMUM (0)
  10.         0x26,0x00, 0xFF, // LOGICAL_MAXIMUM (255)
  11.         0x75,0x08, // REPORT_SIZE (8bit)
  12.         0x95,0x40, // REPORT_COUNT (64Byte)
  13.         0x81,0x02, // INPUT (Data,Var,Abs)

  14.         // The Output report
  15.         0x09,0x04, // USAGE ID - Vendor defined
  16.         0x15,0x00, // LOGICAL_MINIMUM (0)
  17.         0x26,0x00,0xFF, // LOGICAL_MAXIMUM (255)
  18.         0x75,0x08, // REPORT_SIZE (8bit)
  19.         0x95,0x40, // REPORT_COUNT (64Byte)
  20.         0x91,0x02, // OUTPUT (Data,Var,Abs)

  21.         0xc0 /* END_COLLECTION */
  22. }; /* 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程序下载: stm32_usb_hid.zip (2.62 MB, 下载次数: 11538, 售价: 20 )
回复

使用道具 举报

发表于 2012-8-15 23:34:37 | 显示全部楼层

回帖奖励 +2

MSVCR100D.DLL丢失
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-15 23:42:11 | 显示全部楼层
kingsabbit 发表于 2012-8-15 23:34
MSVCR100D.DLL丢失

我用的vs2010编译环境
回复 支持 反对

使用道具 举报

发表于 2012-8-15 23:43:55 | 显示全部楼层
运行的EXE出错,WIN7下提示这个错误
回复 支持 反对

使用道具 举报

发表于 2012-8-16 08:53:28 | 显示全部楼层
顶起
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-16 09:12:49 | 显示全部楼层
kingsabbit 发表于 2012-8-15 23:43
运行的EXE出错,WIN7下提示这个错误

最好自己编译下,我是在XP下弄的
回复 支持 反对

使用道具 举报

发表于 2012-8-18 11:52:39 | 显示全部楼层
先下载看看,像这样的好东东实在难得,谢谢版主
回复 支持 反对

使用道具 举报

发表于 2012-8-19 08:23:00 | 显示全部楼层
谢谢版主! 这些资料很珍贵!
回复 支持 反对

使用道具 举报

发表于 2012-8-19 16:22:03 | 显示全部楼层
GOOOOOD,找他很久了
回复 支持 反对

使用道具 举报

发表于 2012-8-21 15:56:06 | 显示全部楼层
学习         
回复 支持 反对

使用道具 举报

发表于 2012-8-24 21:56:30 | 显示全部楼层
请教一下版主
上位机程序编译出现

Windows 已在 STM32_HID.exe 中触发一个断点。
其原因可能是堆被损坏,这说明 STM32_HID.exe 中或它所加载的任何 DLL 中有 Bug。

这个是哪里的问题
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-24 22:15:34 | 显示全部楼层
asdasdxxx000 发表于 2012-8-24 21:56
请教一下版主
上位机程序编译出现

嘿嘿,这个问题我没遇到过,请问你是用的什么系统?
回复 支持 反对

使用道具 举报

发表于 2012-8-25 09:53:32 | 显示全部楼层
wdluo 发表于 2012-8-24 22:15
嘿嘿,这个问题我没遇到过,请问你是用的什么系统?

深度xp精简版
正在下win7 一会装win7看下
回复 支持 反对

使用道具 举报

发表于 2012-8-26 00:34:48 | 显示全部楼层
请教版主
我用下位机的例程stm32只能发送数据
呀呀usb给stm32发数据接收不到 用busbound也看不到发送的数据
回复 支持 反对

使用道具 举报

发表于 2012-8-26 04:18:34 | 显示全部楼层
那个呀呀usb可能和我的电脑有冲突 换了这个就好了
hid上位机.rar (9.04 KB, 下载次数: 991)
回复 支持 反对

使用道具 举报

发表于 2012-8-27 13:30:31 | 显示全部楼层
用上了2012 传说只能W8支持 我的电脑配置低386
回复 支持 反对

使用道具 举报

发表于 2012-8-31 10:17:50 | 显示全部楼层
谢谢这么好的资料
回复 支持 反对

使用道具 举报

发表于 2012-8-31 11:14:16 | 显示全部楼层
好东西啊。。。。。
回复 支持 反对

使用道具 举报

发表于 2012-9-4 14:35:09 | 显示全部楼层
很好,很强大啊  
回复 支持 反对

使用道具 举报

发表于 2012-9-10 10:56:46 | 显示全部楼层
非常感谢楼主的分享
回复 支持 反对

使用道具 举报

发表于 2012-9-18 11:21:03 | 显示全部楼层
这个不错,顶顶顶!!!
回复 支持 反对

使用道具 举报

发表于 2012-9-23 23:51:41 | 显示全部楼层
非常棒的STM32 USB HID示例!
回复 支持 反对

使用道具 举报

发表于 2012-10-15 14:30:02 | 显示全部楼层
下了,慢慢看
回复 支持 反对

使用道具 举报

发表于 2012-10-15 22:08:55 | 显示全部楼层
很难得的资料,谢谢坛主分享
回复 支持 反对

使用道具 举报

发表于 2012-10-18 20:52:40 | 显示全部楼层
谢谢楼主分享 好好学习一番
回复 支持 反对

使用道具 举报

发表于 2012-10-25 10:46:21 | 显示全部楼层
学习了,谢谢楼主
回复 支持 反对

使用道具 举报

发表于 2012-11-3 08:12:48 | 显示全部楼层
厉害啊,学习中
回复 支持 反对

使用道具 举报

发表于 2012-11-5 00:12:08 | 显示全部楼层
等拿到板子后就可以用上面的USB了
回复 支持 反对

使用道具 举报

发表于 2012-12-12 09:04:01 | 显示全部楼层
谢谢分享。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

发表于 2012-12-20 10:41:07 | 显示全部楼层
牛人啊
回复 支持 反对

使用道具 举报

发表于 2012-12-27 16:21:52 | 显示全部楼层
==================Seaching All USB HID Devices==================
Found 4 USB HID device(s):  (16:20:06)
Product Name: USB Keyboard
Manufacturer:  
Product Name: USB Keyboard
Manufacturer:  
Product Name: USB Keyboard
Manufacturer:  
Product Name: USB OPTICAL MOUSE
Manufacturer: PIXART
No target USB HID device detected. (16:20:06)
程序顺利下载到板子上去了,开usb呀呀,结果说没检测到usb hid器件,,怎么回事呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-12-27 19:56:21 | 显示全部楼层
guozhengdong 发表于 2012-12-27 16:21
==================Seaching All USB HID Devices==================
Found 4 USB HID device(s):  (16:20 ...

你用VS程序测试下试试
回复 支持 反对

使用道具 举报

发表于 2013-1-9 13:31:04 | 显示全部楼层
好东西。楼主牛人啊

回复 支持 反对

使用道具 举报

发表于 2013-3-4 08:21:12 | 显示全部楼层
很好的资料,谢谢了!
回复 支持 反对

使用道具 举报

发表于 2013-3-4 14:55:45 | 显示全部楼层
很好的资料,谢谢了!
回复 支持 反对

使用道具 举报

发表于 2013-3-8 11:40:24 | 显示全部楼层
顶个
回复 支持 反对

使用道具 举报

发表于 2013-3-27 18:32:58 | 显示全部楼层
好东西,感谢楼主
回复 支持 反对

使用道具 举报

发表于 2013-3-28 20:09:50 | 显示全部楼层
果断顶起……………………
回复 支持 反对

使用道具 举报

发表于 2013-3-30 11:09:01 | 显示全部楼层
谢谢分享 正需要的资源
回复 支持 反对

使用道具 举报

发表于 2013-4-3 15:23:25 | 显示全部楼层
wkxwkx101 发表于 2012-11-4 22:15
USB 虚拟串口也可以实现  貌似还更简单哈

你这个挺好的,请问怎么弄啊,谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|纬图虚拟仪器

GMT+8, 2024-12-22 11:47 , Processed in 0.168844 second(s), 22 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表