STM32例程之USB HID双向数据传输
2014-12-15 20:26
393 查看
http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=199
程序功能
将STM32的USB枚举为HID设备。
STM32使用3个端点,端点0用于枚举用,端点1和2用于数据的发送和接收。
端点长度为64,也就是单次最多可以传输64个字节数据。
STM32获取上位机下发的数据并将该数据通过USB原样返回,同时将数据打印输出。
上位机程序通过调用windows的API实现对HID设备的读写控制。
USB接口原理图:
HID枚举成功:
程序效果图
图一 上位机程序运行图
图二 STM32串口打印输出
图三 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程序下载:
stm32_usb_hid.zip (2.62
MB, 下载次数: 7570)
STM32F105/107版本源码下载:
usb_hid.rar (2.16
MB, 下载次数: 6020)
HID上位机程序下载(VS2010):
STM32_HID_PC_Driver.zip (259.02
KB, 下载次数: 3306)
HID上位机程序下载(VS2008):
PC_HID.zip (133.6
KB, 下载次数: 2739)
USB开发相关资料下载
USB2.0技术规范(中文).pdf (2.59
MB, 下载次数: 3678)
Windows主机端与自定义USB_HID设备通信详解.pdf (259.12
KB, 下载次数: 2467)
STM32F10xxx
USB-FS-Device firmware library.pdf (1.27 MB, 下载次数: 3044)
STM32F10xxx
USB开发工具包.pdf (978.66 KB, 下载次数: 3047)
STM32_USB-FS-Device_Lib_V3.0.1.zip (822.59
KB, 下载次数: 2557)
STM32_usb固件库.pdf (978.66
KB, 下载次数: 2908)
基于STM32的USB程序开发笔记.pdf (2.42
MB, 下载次数: 3881)
深入解析STM32_USB-FS-Device_Lib库.pdf (697.35
KB, 下载次数: 2515)
程序功能
将STM32的USB枚举为HID设备。
STM32使用3个端点,端点0用于枚举用,端点1和2用于数据的发送和接收。
端点长度为64,也就是单次最多可以传输64个字节数据。
STM32获取上位机下发的数据并将该数据通过USB原样返回,同时将数据打印输出。
上位机程序通过调用windows的API实现对HID设备的读写控制。
USB接口原理图:
HID枚举成功:
程序效果图
图一 上位机程序运行图
图二 STM32串口打印输出
图三 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程序下载:
stm32_usb_hid.zip (2.62
MB, 下载次数: 7570)
STM32F105/107版本源码下载:
usb_hid.rar (2.16
MB, 下载次数: 6020)
HID上位机程序下载(VS2010):
STM32_HID_PC_Driver.zip (259.02
KB, 下载次数: 3306)
HID上位机程序下载(VS2008):
PC_HID.zip (133.6
KB, 下载次数: 2739)
USB开发相关资料下载
USB2.0技术规范(中文).pdf (2.59
MB, 下载次数: 3678)
Windows主机端与自定义USB_HID设备通信详解.pdf (259.12
KB, 下载次数: 2467)
STM32F10xxx
USB-FS-Device firmware library.pdf (1.27 MB, 下载次数: 3044)
STM32F10xxx
USB开发工具包.pdf (978.66 KB, 下载次数: 3047)
STM32_USB-FS-Device_Lib_V3.0.1.zip (822.59
KB, 下载次数: 2557)
STM32_usb固件库.pdf (978.66
KB, 下载次数: 2908)
基于STM32的USB程序开发笔记.pdf (2.42
MB, 下载次数: 3881)
深入解析STM32_USB-FS-Device_Lib库.pdf (697.35
KB, 下载次数: 2515)
相关文章推荐
- STM32例程之USB HID双向数据传输(源码下载)
- STM32例程之USB HID双向数据传输(源码下载)【转】
- STM32例程之USB HID双向数据传输(转)
- STM32例程之USB HID双向数据传输
- 【iCore3 双核心板】例程十六:USB_HID实验——双向数据传输
- 【iCore4 双核心板_ARM】例程十六:USB_HID实验——双向数据传输
- stm32 USB hid设备与PC进行双向数据传输时PC不识别USB设备
- 【iCore1S 双核心板_ARM】例程十五:USB_HID实验——双向数据传输
- USB HID 读写 STM32 数据失败主要原因分析
- 【iCore3 双核心板】例程十五:USB_CDC实验——高速数据传输
- STM32 USB HID 自定义设备 bulk 传输
- STM32 USB HID 自定义设备 bulk 传输
- 【iCore4 双核心板_ARM】例程十五:USB_CDC实验——高速数据传输
- STM32的USB速度,终于确定了传输极限,为以后的产品设计提供了数据。
- STM32——USB详细使用说明 附件HID的双向通信
- USB那点事3 -使用端口2作为custom HID的传输
- 基于libUSB的USB设备固件更新程序(数据传输部分)
- Netlink 套接字(内核与用户应用间进行双向数据传输的非常好的方式)
- usb 数据传输方式(2)
- 现实Remoting Tcp-Ipc-Http-Channel双向传输任意数据对象