使用 Windows 自带 API 枚举并完成读写的详细步骤,参考下面两篇文章:

https://blog.csdn.net/phenixyf/article/details/72478933

https://blog.csdn.net/phenixyf/article/details/9153195

根据上面文章自己完成的 HID GUI 模板位置如下:

本文主要讲一下异步和同步方式读写 HID 的区别。

使用同步还是异步方式访问 HID 在下面两个地方确定:

  • 枚举 HID 设备过程中,用 CreateFile 打开 HID 设备时。(主要区别就是 CreateFile 倒数第二个参数)

用同步方式打开 HID 设备:

hidHandle = CreateFile(devDetail->DevicePath,NULL,       // 第一次必须用非读写模式打开FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,        // 用同步方式NULL);

用异步方式打开 HID 设备:

hidHandle = CreateFile(devDetail->DevicePath,NULL,       // 第一次必须用非读写模式打开FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED, // 用异步方式 (overlap)NULL);
  • 用 WriteFile 和 ReadFile 函数读写 HID 时。(主要区别就是 WriteFile, ReadFile 的最后一个参数)

用同步方式读写

//写操作
WriteFile(hidHandle, Write_HID_Buf, HIDREPORTNUM, &bytesWritten, NULL);//读操作
ReadFile(hidHandle, Read_HID_Buf, HIDREPORTNUM, &bytesRead, NULL);

用异步方式读写

//写操作
OVERLAPPED hid_write_overlap;   //定义 overlap 对象
WriteFile(hidHandle, Write_HID_Buf, HIDREPORTNUM, &bytesWritten, &hid_write_overlap);//读操作
OVERLAPPED hid_read_overlap;    //定义 overlap 对象
ReadFile(hidHandle, Read_HID_Buf, HIDREPORTNUM, &bytesRead, &hid_read_overlap);

同步方式和异步方式操作过程中的不同:

  • 使用同步方式,当用 WriteFile 和 ReadFile 进行读写操作时,主进程会被阻塞,主进程的其它操作都会被block,直到读写操作完成后,主进程才能进行其它操作。
  • 使用异步方式就不会出现同步的阻塞现象,当 HID 设备在执行读写操作时,主进程仍可以进行其它操作。

所以一般情况下都会使用异步方式访问 HID 设备。

异步操作的具体实现

异步方式有两种实现方式:

  • 启动读写线程
  • 使用 overlap

用线程的方式比较麻烦,如果是在 Windows 系统开发,可以使用 overlap,具体实现如下代码

void ChidTemplateDlg::WriteHIDOutputReport()
{DWORD  bytesWritten = 0;BOOL  result = false;DWORD   res_wait_object;Write_HID_Buf[0] = REPORTID_DATA;if (hidHandle != INVALID_HANDLE_VALUE){result = WriteFile(hidHandle, Write_HID_Buf, HIDREPORTNUM, &bytesWritten, &hid_write_overlap);if (!result)   //因为是 overlap 异步操作,所以 WriteFile 后不会马上返回 true,这是正常的。//判断最终写操作是否成功,是在下面的 switch 中{if (GetLastError() == ERROR_IO_PENDING){//当错误是ERROR_IO_PENDING,那意味着写文件的操作还在进行中//等候,直到文件读完switch ( WaitForSingleObject(hidHandle, HIDREADTIMEOUT) ){case WAIT_OBJECT_0:
//                  MessageBox(_T("HID write successfully"));break;case WAIT_TIMEOUT:MessageBox(_T("HID write fail: timeout"));CloseHandle(hidHandle);      // close hid handleOpenHIDDevice(1);            // re-open hidbreak;default:MessageBox(_T("HID write fail: in overlap process"));break;}  }else{MessageBox(_T("HID write fail: not in overlap process"));}}     }elseMessageBox(_T("write hid fail: hid handle is invaliable"));
}void ChidTemplateDlg::ReadHIDInputReport()
{DWORD  bytesRead = 0;BOOL result = false;DWORD   res_wait_object;if (hidHandle != INVALID_HANDLE_VALUE){result = ReadFile(hidHandle, Read_HID_Buf, HIDREPORTNUM, &bytesRead, &hid_read_overlap);if (!result)   //因为是 overlap 异步操作,所以 ReadFile 后不会马上返回 true,这是正常的。//判断最终读操作是否成功,是在下面的 switch 中{if (GetLastError() == ERROR_IO_PENDING){//当错误是ERROR_IO_PENDING,那意味着读文件的操作还在进行中//等候,直到文件读完switch (WaitForSingleObject(hidHandle, HIDREADTIMEOUT)){case WAIT_OBJECT_0://                 MessageBox(_T("HID write successfully"));break;case WAIT_TIMEOUT:MessageBox(_T("HID read fail: timeout"));CloseHandle(hidHandle);       // close hid handleOpenHIDDevice(1);            // re-open hidbreak;default:MessageBox(_T("HID read fail: in overlap process"));break;}}else{MessageBox(_T("HID read fail: not in overlap process"));}}}elseMessageBox(_T("read hid fail: hid handle is invaliable"));
}

关于 overlap 及其使用的具体讲解可参考下面文章:

https://blog.csdn.net/phenixyf/article/details/126854005

https://blog.csdn.net/phenixyf/article/details/126853088

(582条消息) Overlapped_Phenixyf的博客-CSDN博客

HID 异步访问和同步访问相关推荐

  1. OPC的数据访问方法分别有同步访问、异步访问和订阅式

    OPC的数据访问方法分别有同步访问.异步访问和订阅式数据采集方式三种. 1 同步数据访问方式 OPC服务器把按照OPC应用程序的要求得到的数据访问结果作为方法的参数返回给OPC应用程序,OPC应用程序 ...

  2. SpringMVC中的异步请求-跨域访问

    发送异步请求: <%@page pageEncoding="UTF-8" language="java" contentType="text/h ...

  3. java map同步访问_同步 - Java synchronized块与Collections.synchronizedMap

    您的代码中可能存在细微的错误. [更新:因为他正在使用map.remove(),所以这种描述并不完全有效. 我第一次错过了这个事实. :(感谢问题的作者指出这一点.我将其余部分保留原样,但改变了主要声 ...

  4. jmu-Java-07多线程-同步访问 (10分)

    jmu-Java-07多线程-同步访问 (10分) 现已有Account类,拥有 属性: private int balance 方法: 相应的getter方法. 要求为该类编写: void depo ...

  5. 为什么异步Python比同步Python快?

    在本文中,我将继续使用 Web 应用程序作为例子,但还有其它类型的应用程序也从并发中获益.因此,这个讨论并不仅仅是针对 Web 应用程序的.你是否听人们说过,异步 Python 代码比"普通 ...

  6. python实现异步的几种方式_终于搞明白了,异步Python比同步Python究竟快在哪里?...

    大家好,你是否听人们说过,异步 Python 代码比"普通(或同步)Python 代码更快? 果真是那样吗? 同步和异步是什么意思? Web 应用程序通常要处理许多请求,这些请求在短时间内来 ...

  7. google android广告异步加载,谷歌广告异步代码和同步代码的解决方法

    通常大部分人初次接触谷歌google adsense广告联盟都会有疑问,在新建单元界面我们可以看到获取代码类型选项.下面是学习啦小编为大家整理的关于谷歌广告异步代码和同步代码的解决方法,一起来看看吧! ...

  8. java并发访问_Java并发访问

    1 线程安全 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用.不会出现数据不一致或者数据污染. 线程不安全就 ...

  9. linux编写驱动后write已杀死_《Linux4.0设备驱动开发详解》笔记--第九章:Linux设备驱动中的异步通知与同步I/O...

    在设备驱动中使用异步通知可以使得对设备的访问可进行时,由驱动主动通知应用程序进行访问.因此,使用无阻塞I/O的应用程序无需轮询设备是否可访问,而阻塞访问也可以被类似"中断"的异步通 ...

最新文章

  1. Android仿QQ列表滑动弹出按钮、长按提示、刷新列表
  2. 【win32汇编】0x01 开篇一些乱七八糟的话
  3. CTFshow 命令执行 web55
  4. matlab 边缘光滑,如何使用matlab来平滑图片的边缘
  5. boost::allocate_shared相关的测试程序
  6. PHP算法按数组某一字段进行排序
  7. Java EE调度程序
  8. openresty安装(centos)
  9. PHP GD压缩图片
  10. 卡开启中断_上网卡顿、网络连接中断……9012年了PC上网还只靠宽带?
  11. 几个小伙伴的进入信息安全行业的经历
  12. 微星主板B550M破击炮无U刷BIOS 内存条插3/4卡槽出现DRAM灯常亮,屏幕无法显示
  13. JVM之垃圾回收机制(GC)
  14. 机器学习之ID3算法原理
  15. 最方便简单的经纬度查询方法
  16. ROS笔记(一)xxx.launch文件详解
  17. wincc项目 CS结构 ES工程师站下装到OS服务器失败或者特别慢的原因
  18. 【MarkMan】图片标注测量
  19. 诗鬼李贺:只活27岁,让我们争吵千年
  20. python读取图片、保存图片的方法

热门文章

  1. Android OTG 连接单反相机,相机无法预览已拍照片问题修复笔记
  2. 微信小程序|页面动态更新数据
  3. 隐私计算唯一代表厂商!洞见科技入选《爱分析·数据智能厂商全景报告》
  4. 什么是物联网?什么是物联卡 ?物联卡中心深度解析!
  5. CAD图纸文件如何转换成常见的彩色PDF文件?
  6. 工业互联网:2 设备端(3)
  7. MFC实现位图超链接代码
  8. 手机开发实战163——视频介绍
  9. ICPC 6828 Help cupid(Regionals 2014 Latin America)
  10. Android 正确判断屏幕解锁事件