STM32例程之USB HID双向数据传输

2023-11-19

http://www.viewtool.com/bbs/forum.php?mod=viewthread&tid=199&extra=page%3D1

程序功能

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

USB接口原理图:

 

HID枚举成功:

 

程序效果图

 

图一 上位机程序运行图

 

图二  STM32串口打印输出

 

图三 Bus Hound抓取的数据

程序部分代码

STM32的报告描述符:

  1. const uint8_t CustomHID_ReportDescriptor[CUSTOMHID_SIZ_REPORT_DESC] = 
  2.         0x05, 0x8c, /* USAGE_PAGE (ST Page) */ 
  3.         0x09, 0x01, /* USAGE (Demo Kit) */ 
  4.         0xa1, 0x01, /* COLLECTION (Application) */ 
  5.         
  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. }  

复制代码



from:http://blog.163.com/lby147612@126/blog/static/17041045220151123115729850/








本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32例程之USB HID双向数据传输 的相关文章

  • 对 USB 传输电缆进行编程/与 USB 设备驱动程序通信

    如何以编程方式访问 USB 传输电缆 例如 Belkin 的易传输电缆 http www belkin com easytransfercable 从Windows 我熟悉libusb win32 http libusb win32 sou
  • 在c++中接收USB设备插入的通知/事件/信号

    我已经寻找了一段时间 但一直无法找到这个问题的答案 我正在尝试接收特定 USB 设备的连接通知 这是我所知道的 我运行的是 linux 内核版本 3 2 我有识别 USB 设备所需的 ID 我创建了一个用于读取和写入设备的内核模块 内核模块
  • Android Studio 无法将 Nexus 7 识别为设备

    我在 Nexus 7 上运行我在 Android Studio 中开发的应用程序时遇到问题 在使用同一台平板电脑和计算机 运行 Windows 8 之前 我已成功使其正常工作 但自从我的笔记本电脑修好并且所有内容都被擦除后 我确信我的开发环
  • macOS下如何查找串口的父USB设备?

    以下是我尝试枚举 Mac 上找到的所有串行端口 并遍历设备节点树以查找 USB 串行适配器的父 USB 设备的方法 import
  • 检测 Android 上的 USB 网络共享

    有没有什么方法可以 以编程方式 在您的活动 应用程序中知道用户已在其手机上启用 USB 网络共享 您还可以使用反射来访问用于设置 USB 网络共享的隐藏功能 这是我的代码 ConnectivityManager cm Connectivit
  • USB 控制传输能否保证交付?

    USB 2 0 指定 http www usb org developers docs usb20 docs 4 种传输类型 第 5 4 节传输类型 控制转移 同步传输 中断传输 批量转账 第 5 8 节规定批量转账提供 在带宽可用的基础上
  • 如何阻止 Linux 初始化 USB HID 设备

    我有一个 USB HID 设备 可以在两种不同的模式下工作 模式的选择基于发送给它的 USB 枚举 初始化数据包的顺序 我使用的是运行 Raspbian 的 Raspberry Pi 3 但是如果我为桌面 Ubuntu 发行版编译代码 我也
  • ALSA 记录 - 了解内存映射

    我尝试使用 ALSA 从 USB 音频设备获取输入并将其作为一系列内容写入磁盘signed short价值观 我最终得到的是看似有效的数据块 其中散布着大块的零 我猜测我的缓冲区设置不正确并且没有正确使用内存映射 我正在尝试什么 采样率 8
  • 如何在 OSX Catalina (10.15) 中使用 Wireshark 捕获 USB 流量

    我正在尝试让 Wireshark USB 捕获工作 显然 Catalina 之前的技巧就是调出界面 以便 Wireshark 可以看到它 https forums developer apple com thread 95380 https
  • python的跨平台usb模块?

    我有兴趣在 python 中使用 USB 设备进行一些跨平台工作 关于可以执行此类操作的模块有任何提示或建议吗 我浏览了 SF 和 googlecode 但运气不佳 thanks ct PyUSB http pyusb berlios de
  • 使用 C# 向 USB 连接的 GPRS 调制解调器发送 AT 命令

    任何人都可以给我一个关于如何访问连接到 USB 端口的 GPRS 调制解调器的良好指示或指南 我应该为我的程序制作一个 USB 驱动程序以将 AT 命令发送到调制解调器吗 或者就像一个路由器 我可以使用IP地址访问它 谢谢 如果 Windo
  • 使用 python 检测 Windows 10 上的 USB 设备插入

    我无法获取以下代码检测USB设备插入 http timgolden me uk python win32 how do i detect device insertion html在我的 Windows 10 64 位 计算机上使用 Pyt
  • 在 Mac 上通过 USB 访问 iOS 设备

    我有一个移动应用程序需要将文件传输到数据库 然而 其规范之一是 如果用户没有设置无线网络 则应该能够将其插入 Mac 并将文件传输到数据库 然而 我遇到的问题是如何将上述文件从 iPad 上通过 USB 传输到计算机上 上周我研究了各种解决
  • 如何查找USB盘符?

    我正在编写一个安装程序来将应用程序安装到 USB 驱动器 该应用程序只能从 USB 驱动器使用 因此它可以通过自动选择要安装的 USB 驱动器来为用户节省额外的步骤 我可能会尝试使用 Nullsoft 或 MSI 进行安装 但由于我最熟悉
  • USB接口条码扫描器

    不完全是一个编程问题 但很接近 无论如何我都会试试运气 The 键盘楔子 扫码机插入 读者之间的翻译装置 和键盘 数据发送通过 楔形看起来就像是被输入的 电脑 而键盘 本身仍保持完整功能 因为电脑使用键盘 楔子无法区分 在输入的数据之间 扫
  • 如何设置USB连接模式?

    我正在编写一个应用程序 该应用程序应该将数据转储到 SD 卡上 然后在 PC 上编写另一个应用程序 当设备连接到 PC 时 在光盘驱动器模式下 该应用程序应该读取数据 在我的 HTC Legend 上 有一个对话框可供选择 仅充电 HTC
  • STM32 传输结束时,循环 DMA 外设到存储器的行为如何?

    我想问一下 在以下情况下 STM32 中的 DMA SPI rx 会如何表现 我有一个指定的 例如 96 字节数组 名为 A 用于存储从 SPI 接收到的数据 我打开循环 SPI DMA 它对每个字节进行操作 配置为 96 字节 是否有可能
  • 使用 BeagleBone Black 内核 >= 3.8 打开/关闭 USB 电源

    我需要 关闭 gt 睡眠几秒钟 gt 打开 beaglebone black 的 USB 电源 能够对连接到 USB 的设备 华为 E220 调制解调器 进行硬件重置 已经尝试过软重置 使用取消绑定 绑定和授权0 1 但软件重置不足以使设备
  • Delphi - 如何获取 USB 可移动硬盘和记忆棒的列表?

    在我的应用程序 Delphi 中 我需要列出所有 USB 存储设备 这些可以是闪存棒or外部存储驱动器 有一个Jvcl成分JvDriveCombo 并且它有DriveType属性 问题是我是否选择DriveType Fixed那么除了外部驱
  • 使用 Windows 原始访问 API 直接访问 USB 驱动器

    在USB物理驱动器的末尾 我想使用Windows原始访问API直接写入数据 我不想使用内核驱动程序来做到这一点 据我所知 出于安全原因 Windows XP SP2 或 SP3 阻止了 HDD 直接访问 我不确定 USB 驱动器是否如此 请

随机推荐

  • C++中std::sort/std::stable_sort/std::partial_sort的区别及使用

    某些算法会重排容器中元素的顺序 如std sort 调用sort会重排输入序列中的元素 使之有序 它默认是利用元素类型的 lt 运算符来实现排序的 也可以重载sort的默认排序 即通过sort的第三个参数 此参数是一个谓词 predicat
  • 转载:IT项目管理-看板管理

    作为一个开发团队的管理者 例如当你是一个团队的项目经理的时候 任务的完成情况通常是你最关心的内容之一 比如说分配的任务是否能够按时间完成 整个项目的进度是否尚在计划之中 团队内的人是不是都在高效地工作 大家有没有什么困难 这些是你经常会关注
  • 无刷直流电机控制MATLAB仿真,使用Simulink进行无刷直流电机控制仿真

    这段时间刚开始接触Matlab中的Simulink仿真 我就结合自己的专业 利用Simulink进行了无刷直流电机的仿真 因为Simulink工具箱里面有很多可用的模块 所以建模过程变得非常简单 在Matlab界面中new gt model
  • MSP430F42X系列单片机SD16例程(16位AD采样)

    说明 该驱动程序库包含了常用的16位ADC SD16 操作与控制功能函数 如选择通道 设置信号放大倍数 设置数据格式 基准源输出开关等 以及常用采样函数 包括单通道采样 平均采样 多通道同时采样等 可以作为各种程序的底层驱动使用 要使用该库
  • 51单片机多机通信

    视频学习链接 https www bilibili com video BV1pi4y147A6 spm id from 333 880 my history page click vd source b91967c499b23106586
  • Zabbix的模板管理与配置

    Zabbix的模板管理与配置 一 查看默认模板的配置项 1 打开客户端信息配置界面 2 选择默认模板的监控项 二 服务端获取客户端的监控项 1 获取客户端系统相关监控项 2 获取客户端硬盘信息等相关监控项 三 创建自定义监控项的key 1
  • 如何在IDEA中使用JDBC

    如何在IDEA中使用JDBC 摘要 安装JDK及IDEA mysql下载安装及预处理 JDBC驱动下载 新建IDEA项目 添加JDBC驱动文件至项目 编写java测试语句 摘要 本文主要介绍了如何用IDEA新建一个java项目 并用JDBC
  • Docker私服之Harbor搭建全过程【安装+启动+jar镜像构建、推送、拉取、运行】

    1 docker安装 docker compose docker和docker compose安装参考链接 2 harbor安装 harbor下载 harbor offline installer v2 5 3 tgz 我下载的版本是2 5
  • 芯片制造系列全流程:设计、制造、封测

    目录 芯片制造系列全流程 简 一 芯片制造全流程简介 二 芯片设计 三 芯片制造 四 封装测试 芯片目前分为三个主要环节 分别是设计 制程 封测 设计水平 制造这一块 最后说说封测这一块 芯片设计 芯片制造 封装测试完整解读 01 芯 片
  • 手把手教你安装CUDA(一看就会)

    1 背景 学习深度学习的话 肯定需要安装PyTorch和TensorFlow 安装这两个深度学习框架之前得安装CUDA CUDA是什么 CUDA是一个并行计算平台和编程模型 能够使得使用GPU进行通用计算变得简单和优雅 Nvidia官方提供
  • 树状数组笔记

    数组 前缀和 树状数组的区别 数组 修改某点O 1 求区间O n 前缀和 修改某点O n 求区间O 1 树状数组 修改某点O logn 求区间O logn 树状数组采取折中的方式 降低整体的时间复杂度 由于算法复杂度取决于最坏的情况的复杂度
  • 1.vs2019 配置Eigen

    目录 一 下载Eigen 二 创建工程 三 测试代码 四 运行结果 一 下载Eigen 下载地址 http eigen tuxfamily org index php title Main Page Download 下载后 将文件解压 二
  • Python--pytesseract验证码识别处理实例

    linux ubuntu系统 安装过程 pytesser 调用了 tesseract 因此需要安装 tesseract 安装 tesseract 需要安装 leptonica 否则编译tesseract 的时候出现 configure er
  • mysql 自定义函数 if not exists_IF配合AND、OR以及NOT函数使用,可以解决工作中的不少难题...

    前面小编已经分别介绍了逻辑判断函数IF AND OR及NOT的用法 同时也提到它们比较少单独使用 那么 这篇文章我们就来介绍一下IF分别和AND OR及NOT的配合用法 1 函数定义回顾 首先来回顾下这4个逻辑判断函数的定义 1 IF函数
  • 每日一题:整齐的数组

    整齐的数组 题目 Daimayuan Online Judge 每一次可以选择一个ai减去k 可以进行若干次操作 使得所有数变相同 说明跟顺序无关 可以从小到大排个序 k大于等于1 说明了每个数只能变小不能变大 那么每个数只能变得和最小的那
  • Android-系统分享使用小结

    Android 系统分享使用小结 概述 如何进行分享 如何筛选分享项 如何区分部分APP下不同分享界面 以微信为例 如何还原过滤前APP分享途径的描述 概述 说到分享 有很多第三方的SDK可供使用 比如友盟 mob都很好用 虽然集成相对容易
  • netcore 文件服务器,在 ASP.NET Core 中上传文件

    ASP NET Core 支持使用缓冲的模型绑定 针对较小文件 和无缓冲的流式传输 针对较大文件 上传一个或多个文件 安全注意事项 向用户提供向服务器上传文件的功能时 必须格外小心 攻击者可能会尝试执行以下操作 执行拒绝服务攻击 上传病毒或
  • supervisor

    使用 安装配置 待续 服务配置 program g7service command bin bash c dotnet YH TaskManager Collect dll directory home service g7 stderr
  • Ubuntu20.04美化成mac 系统样式

    一 效果 二 安装源 1 sudo gedit etc apt sources list deb http mirrors 163 com ubuntu focal main restricted deb http mirrors 163
  • STM32例程之USB HID双向数据传输

    http www viewtool com bbs forum php mod viewthread tid 199 extra page 3D1 程序功能 将STM32的USB枚举为HID设备 STM32使用3个端点 端点0用于枚举用 端