通信逻辑:当你插上游戏手柄的时候,它就会一包一包数据往电脑上发,只是我们没有合适的接收处理,所以看不出来,它类似与UDP的报文,只管发,它一包的数据长度是固定的,逻辑类似每个按键控制数据包中的一个位置的值的变化,我们用的就是通过判断按键对应的那个位置的值的变化来处理按键的功能

难点一:要明白:作为一个新手没处理过这种HID数据处理的开发者来说,首先要做的就是先连通能收到数据再说,至于硬件啊,协议啊什么的,完全不需要去关心

难点二:从网上找资料,下载C语言的实现的接口文件,但是下载绑定能恶心死人

难点三:文件找到了,怎么用,怎么个包含关系,网上的demo代码没注释,看的是一脸懵逼说不准抄的什么地方出了问题就崩了

解决办法:

第一步:将下载下来的头文件/源文件跟自己的代码放到一个文件夹里,就当它是自己写的一个类;可以直接扫码从我的网盘中下载接口文件

第二步:进行具体的代码书写,内容以及解释看以下代码块:


//需要包含的头文件
#include <stdio.h>
#include <wchar.h>
#include <string.h>
#include <stdlib.h>
#include "hidapi.h"
//包含库
#ifdef _WIN32
#pragma comment (lib,"setupapi.lib")
#endif//需要用到sleep,根据Windows和linux系统包含不同的头文件
#ifdef _WIN32
#include <windows.h>
#else
#include <unistd.h>
#endifint main(int argc, char *argv[])
{//定义容器,用来存放各种数据(例如:从usb发到本机的数据)unsigned char buf[256];memset(buf,0x00,sizeof(buf));//HID设备的句柄hid_device *handle;//循环查找本地的设备数,以及每个设备的信息//后续开发需要用到设备的VID,PID,作为识别设备的参数//devInfo备用指针用来遍历查找本地的设备//注:VID,PID,可以通过查看本地信息直接输入具体值,也可以代码查找,找到了,进行赋值//建议代码扫设备(遇到过一包数据数据是27个字节来代表不同的按键,插拔了一次变成了9个字节代表按键,本地VID,PID信息的值也变了)struct hid_device_info *devInfo;//设备容器,存放找到的设备信息struct hid_device_info* devArray[10];memset(devArray,0,10);//用来表示设备容器devArray[10]的下标int devArrayIndex=0;//指针初始化,初始化成功代表存在devInfo = hid_enumerate(0x0, 0x0);while (devInfo) {devArray[devArrayIndex++]=devInfo;//将找到的设备交给容器记录printf("Device Found:\n");printf("VID:%04hx\n",devInfo->vendor_id);//printf("PID:%04hx\n",devInfo->product_id);printf("\n");//通过next来寻找是否存在下一个设备//注:只有一个设备的时候,可以注掉这句代码//   如果有多个设备,记得定义多个指针来接收设备信息devInfo = devInfo->next;}hid_free_enumeration(devInfo);//删除最后一个没找到设备的指针//调试信息:循环遍历显示所有找到的设备信息(开发只用VID,PID信息,因此只显示这俩值)int index=0;while (devArray[index]) {printf("dev%d:VID:%04hx\n",index,devArray[index]->vendor_id);printf("dev%d:PID:%04hx\n",index,devArray[index]->product_id);index++;}//打开USB句柄handle = hid_open(devArray[0]->vendor_id,devArray[0]->product_id , NULL);if (!handle) { //判断是否连接(打开)成功printf("unable to open device\n");}//开始接收数据printf("Start Data read:\n");while (true) {//res是实际收到的字节数,65是预留的长度//如果知道会收到一包数据的固定长度,65可以预设//hid_read是读取数据,存放到buf中,无限时的等待,直到收到数据为止//hid_read_timeout()中的第四个参数可以设置超时,不管有没有收到数据,都退出int res=hid_read_timeout(handle, buf, 65,100);//100是超时设置,毫秒//调试信息:输出显示收到的数据for (i = 0; i < res; i++)printf("%03d ", buf[i]);printf("\n");//休眠时间可以根据具体情况设,但是不能没有,没有sleep容易导致主线程来不及处理导致界面卡死Sleep(100);}//资源回收(指针回收)hid_close(handle);hid_exit();index=0;while (devArray[index]) {hid_free_enumeration(devArray[index]);index++;}return 0;
}

第三步:使用过程中应该是线程里接收数据进行处理,然后将数据交给主线程使用;因此,等知道代码的每一步的意思后就得靠自己进行具体的代码结构设计和开发了;

注:测试过程中遇到过同一个手柄,同一个主机,在一次插拔后,设备的VID,PID的值变了,收的包的数据长度变了,好在我使用的数据的位置没变,没造成大的影响,但是不知道发生的原因(如果有知道的请留言告知,感激不尽);

因此,再次建议开发时尽量通过代码来扫描查找设备PID,VID等参数值,后期能省事很多;

USB-HID游戏手柄的数据通信相关推荐

  1. STM32CubeMX学习(一) USB HID 双向通信

    STM32CubeMX学习(一) USB HID 双向通信 简介 CubeMX新建工程(串口+LED) 测试串口和LED 设置USB HID 测试USB HID通信 结论 简介 利用正点原子F407探 ...

  2. C++ MFC界面读写USB HID设备数据程序

    C++ MFC界面读写USB HID设备数据程序 发一个简单易用的界面,用来对USB HID设备(比如说游戏手柄,控制面板等)读写数据,一般情况下面板上有一些LED,可以帮助我们测试读写是否正确.另外 ...

  3. [转载]基于Stm32,LD3320的非特定语音识别USB HID Keyboar

    基于Stm32,LD3320的非特定语音识别USB HID Keyboard实现 ---用声音跟机器沟通 鉴于手头拥有一块ST官方的stm32f407VG discover板子以及一块ICRoute公 ...

  4. 记录一下 开发STM32 USB HID踩过的坑

    记录一下 开发STM32 USB HID踩过的坑 一.前言 二.代码配置 一.前言 MCU: STM32F103C8T6 CubeMX: STM32CubeMX 5.3.0 二.代码配置 引脚配置 时 ...

  5. USB HID转蓝牙鼠键宏指纹解锁

    USB-HID-BLER 将有线鼠标键盘游戏手柄等USB HID转换为蓝牙设备,附带鼠键宏和指纹解锁功能. 硬件开源地址  前作 主要功能 使用esp32-c3的GPIO模拟USB HOST,识别低速 ...

  6. USB HID 协议

    USB HID 协议入门 转载请注明来源:cuixiaolei的技术博客 USB HID设备类的应用场合 USB HID类是USB设备的一个标准设备类,包括的设备非常多.HID类设备定义它属于人机交互 ...

  7. USB HID学习:MFC检测USB拔插事件

    MFC具备检测设备的消息,但需要手动添加.针对USB设备,需要注册对应的GUID方可.本文对此进行简单记录. 本省略对MFC机制的描述,仅描述主要的模块代码. 一.步骤 Dbt.h头文件引用 在std ...

  8. USB HID学习:数据包分析

    本文使用 Bus Hound 工具对 USB HID 设备数据包进行分析,并结合官方手册及网上文章进行整理.文中未提到的知识,建议移步参考资源. 以笔者经验,直接阅读协议无法直观理解,最好使用工具抓包 ...

  9. Visual Studio 2010 Win32 Usb HID 动态库创建

    一.概述 最近在项目中使用md5和sh1 算法,发现在原来的工程上,加上这两个算法的源代码竟然编译不能通过,出现100 多个bug.后来上来发现错误都是源于两个算法使用的一个头文件"StdI ...

  10. STM32 USB HID IAP升级

    找了网上大量的资料,最后发现这个东西人家还出售源码.又不是什么算法级的东西,实在理解不了. 至于为什么要用HID,不用官方的DFU,因为驱动呀,DFU识别USB的时候还是要装驱动,客户你永远理解不了他 ...

最新文章

  1. 一个帮助Java开发者快速学会Kotlin的开源项目
  2. 八、redis性能测试
  3. Qt Designer设置背景图片、颜色不影响其它组件小技巧,控件层级设置,组件的继承,styleSheet设置样式。
  4. 数据结构-------赫夫曼树
  5. Linux上tomcat运行内存溢出,linux中tomcat内存溢出解决办法
  6. 联想微型计算机安装Win7,联想c340如何安装win7_联想c430一体机改win7系统步骤
  7. Editor编辑器操作
  8. 苹果手机语音备忘录在哪_苹果手机的录音功能在哪?教你快速开启,想录音太方便了...
  9. 啊哈添柴挑战1057向世界问好C++
  10. 云服务器怎么配置cpu与内存搭配
  11. 你的数据库到底应该如何存储密码?
  12. 51 Best DevOps Tools for #DevOps Engineers
  13. 3d max 场景转换对话框
  14. FlexiTimer2库下载 无偿 分享 仅供学习
  15. Nordic Thingy:52 Android App 源码及APK
  16. 算法设计 - 寻找一个字符串的重复子串LRS
  17. 冯大辉Twitter每日推荐一位推友计划推友列表
  18. 编程方法论/架构设计/模式相关转载链接汇总
  19. 【数据结构】B树(B-树)和B+树
  20. linux获取中括号内容,shell里使用正则表达式提取括号中的内容

热门文章

  1. 深度好文| Redis面试全攻略
  2. 1013: 【顺序结构】数字各位分割
  3. 华中科技大学计算机学院本科生宿舍,[业余派]告诉你一个真正的华中科技大学...
  4. 使用命令行修复windows系统
  5. 想学python网课哪个好-推荐书单(网课)-人生/编程/Python/机器学习-191本
  6. python 等值面_ANSYS Fluent快速添加等值面/等值线 源代码-教育代码类资源
  7. 论文笔记:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks
  8. VS2017中添加Flash控件
  9. numpy部分函数使用总结
  10. 白纸不够白,签名照片还需要ps去除背景?Python大法半完美解决电子签名背景问题(20行代码去除签名背景)