|
STM32之USB HID双向数据传输源程序下载
[复制链接]
程序功能- 将STM32的USB枚举为HID设备。
- STM32使用3个端点,端点0用于枚举用,端点1和2用于数据的发送和接收。
- 端点长度为64,也就是单次最多可以传输64个字节数据。
- STM32获取上位机下发的数据并将该数据通过USB原样返回,同时将数据打印输出。
- 上位机程序通过调用windows的API实现对HID设备的读写控制。
USB接口原理图:
12 小时前 上传
下载附件 (86.58 KB)
HID枚举成功:
12 小时前 上传
下载附件 (63.87 KB)
程序效果图
2012-8-15 19:09 上传
下载附件 (61.6 KB)
图一 上位机程序运行图
2012-8-15 19:09 上传
下载附件 (144.24 KB)
图二 STM32串口打印输出
2012-8-15 19:42 上传
下载附件 (95.59 KB)
图三 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 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 printf("0x%02X ",recvDataBuf[i+1]);
- }
- printf("\n\r");
- }
复制代码
程序源码下载:点我点我
|
|