copy from http://blog.csdn.net/luckywang1103/article/details/12393889#  

HID是Human Interface Devices的缩写,即人机接口设备。HID设备的一大优势就是操作系统已经内置了HID设备驱动,一般不需要安装驱动程序。通用的HID设备可以直接使用HID设备类驱动程序(hidclass.sys)和HID小驱动程序(hidusb.sys).

在应用程序内引入头文件

extern "C"

{

  #include "hidsdi.h"

  #include <setupapi.h>

}

1:查找设备

在应用程序能与HID设备交换数据之前,它先要找到设备,获取关于它的报告信息。

1)HidD_GetHidGuid(&guidHID);来获取HID设备的标示,HID类设备是通过GUID类型值作为标示的。GUID是16字节大小的结构,用来标示通信接口及类对象,他的定义为:

2)还需要调用其他与硬件相关的API函数,这些函数都在setupapi.h 中定义。

  SetupDiGetClassDevs函数用来获得一类硬件设备的信息,设备信息集句柄hDevInfo

  HDEVINFO hDevInfo = SetupDiGetClassDevs(

    &guidHID,//这类设备配置或接口类GUID

    NULL,// 特定的字符串,用来选择合适条件的蛇别

    0,//  与获得信息相关的顶层窗体句柄

    DIGCF_PRESENT | DIGCF_DEVICEINTERFACE //给出了设置信息的方式

    );

3)SetupDiEnumDeviceInterface函数得到设备接口信息,反复调用得到所有设备接口信息strInterfaceData,若要找到特定设备,可在循环语句内调用该函数,直到找到预期设备或函数返回False值,定义为:

  Bool bSuccess = SetupDiEnumDeviceInterface(

    hDevInfo,  //感兴趣的接口句柄

    NULL, //指向SP_DEVINFO_DATA类型结构的指针,该结构定义额特定接口

    &guidHID,  //确定了接口的GUID标示

    Index,  //所关心的索引号,以0为起点

    &strInterfaceData,  //指向SP_DEVICE_INTERFACE_DATA类型的指针,他所指向的内容就是调用函数的目的所在,当函数返回时,strInterfaceData指向的结构就存在相关接口信息  );

  }

  其中SP_DEVINFO_DATA结构定义为:

  typedef struct SP_DEVINFO_DATA{

  DWORD cbsize;//指向结构的大小

  GUID calssGUID; //设备的GUID标志

  DWORD DevInst;//用来访问设备的句柄

  ULONG_PTR Reserved;

  }SP_DEVINFO_DATA,*PSP_DEVINFO_DATA;

  SP_DEVICE_INTERFACE_DATA结构的定义如下:

  typedef struct SP_DEVICE_INTERFACE_DATA{

  DWORD cssize;  //是SP_DEVICE_INTERFACE_DATA结构的大小

  GUID InterfaceClassGuid;  //指定了接口的GUID标示

  DWORD Flags;  //接口所处状态

  ULONG_PTR Reserved;

  }SP_DEVICE_INTERFACE_DATA,*PSP_DEVICE_INTERFACE_DATA;

4) SetupDiGetDeviceInterfaceDetail()

  long Result = SetupDiGetDeviceInterfaceDetail(

  hDevInfo,  //设备信息集句柄

  &strInterfaceData,  //设备接口信息

  NULL,

  0,

  &Length,

  NULL);

  再次调用为了得到strInterfaceDetailData

  long Result = SetupDiGetDeviceInterfaceDetail(

  hDeviceInfo,

  &strInterfaceData,

  strInterfaceDetailData,

  Length,

  &Required,

  NULL);

2,与USB设备交换数据

  在Windows中,读写端口与读写文件都是调用同样的API函数,打开或创建端口用CreateFile,从端口读取数据ReadFile,用WriteFile向端口写入数据

  1) 设备的打开与关闭

    用API函数CreateFIle来打开或者创建设备

    HANDLE hCom = CreateFile(

    strInterfaceDetailData->DevicePath,

    GENERIC_READ | GENERIC_WRITE,

    0,

    NULL,

    OPEN_EXISTING,

    FILE_ATTRIBUTE_NORMAL,

    NULL,

    );

  如果调用成功,函数则返回文件的句柄,如果调用失败,则返回INVALID_HANDLE_VALUE,在打开通信设备是,应该以独占方式打开,不再使用设备句柄时,应该调用CloseHandle(hCom)函数来关闭。

  2)Bool Result = HidD_GetAttributes(hCom,&strAttrib);

    其中hCom是对应于选定设备的句柄,strAttribute则是指向HIDD_ATTRIBUTES类型的指针,当函数返回时即得到了指定设备的属性

    typedef struct _HIDD_ATTRIBUTES{

    ULONG Size;

    USHORT VendorID;

    USHORT VersionNumber;

    }HIDD_ATTRIBUTES,*PHIDD_ATTRIBUTES;

  3) 设备的读写操作,读写通信设备可用同步方式执行

    HANDEL hCom;

    void *pBuffer;

    DWORD iLength;

    DWORD pReadFace;

    Bool ReadFile(hCom,pBuffer,iLength,&pReadFact,NULL);

   读取刀的数据放在pBuffer中,pBuffer要先申请内存空间,iLength为需要读的数据长度,pReadFact存放实际的数据长度。读写设备前,应该调用ClearCommError函数清除,该函数负责报告指定的设备的当前状态,调用PrugeComm函数可以更改正在进行的读写操作方式

 

USB接口程序编写的更多相关文章

  1. Linux驱动之USB鼠标驱动编写

    本篇博客分以下几部分讲解 1.介绍USB四大描述 2.介绍USB鼠标驱动程序功能及框架 3.介绍程序用到的结构体 4.介绍程序用到的函数 5.编写程序 6.测试程序 1.介绍USB四大描述符 USB设 ...

  2. 20151009 C# 第一篇 程序编写规范

    20151009 程序编写规范 1. 代码书写规则: 1).尽量使用接口,然后使用类实现接口. 2).关键语句写注释 3).避免写超过5个参数的方法,如果要传递多个参数,则使用结构 4).避免代码量过 ...

  3. [转]支付宝接口程序、文档及解读(ASP.NET)

    本文转自:http://www.cnblogs.com/blodfox777/archive/2009/11/03/1595223.html 最近需要为网站加入支付宝的充值接口,而目前关于支付宝接口开 ...

  4. Android Camera 相机程序编写

    Android Camera 相机程序编写 要自己写一个相机应用直接使用相机硬件,首先应用需要一个权限设置,在AndroidManifest.xml中加上使用设备相机的权限: <uses-per ...

  5. 基于Asterisk的VoIP开发指南——(2)Asterisk AGI程序编写指南

    原文:基于Asterisk的VoIP开发指南--(2)Asterisk AGI程序编写指南 5. Asterisk AGI程序编写指南 5.1概述 很多时候,我们需要在拨号方案中做某些业务逻辑的判断或 ...

  6. rockchip 3128 平台USB接口鼠标U盘功能调试日记

    2019-04-12 关键词: rk3128 OTG.rk3128外接鼠标U盘.RK外接鼠标U盘 本篇文章是笔者根据自己当前所掌握知识对 rk3128 平台 USB 接口接鼠标实现输入功能调试的一个记 ...

  7. 直接端口打印 支持USB接口的打印机吗?解决办法

    直接端口打印 支持USB接口的打印机吗?解决办法 www.MyException.Cn  网友分享于:2013-09-15  浏览:488次       直接端口打印 支持USB接口的打印机吗?问题如 ...

  8. 支付宝接口程序、文档及解读(ASP.NET)

    最近需要为网站加入支付宝的充值接口,而目前关于支付宝接口开发的资料比较杂乱,这里就我此次开发所用到的资料进行汇总整理,希望能够帮助需要的朋友. 开发步骤: 1. 确定签约类型 支付宝的接口有多种类型, ...

  9. Mathcad 是一种工程计算软件,主要运算功能:代数运算、线性代数、微积分、符号计算、2D和3D图表、动画、函数、程序编写、逻辑运算、变量与单位的定义和计算等。

    Mathcad软件包Mathcad是由MathSoft公司(2006 年4 月被美国PTC收购)推出的一种交互式数值计算系统. Mathcad 是一种工程计算软件,作为工程计算的全球标准,与专有的计算 ...

随机推荐

  1. C#中datagridview选中行后textbox显示选中的内容

    我想让datagridview中某一行被选中时,textbox中显示选中的值,datagridview的选中模式是整行:this.dataGridView1.SelectionMode = DataG ...

  2. Java Junit 基础笔记

    Junit 1. 概念 JUnit是一个Java语言的单元测试框架. 单元测试:单元测试(英语:Unit Testing)又称为模块测试, 是针对程序模块(软件设计的最小单位)来进行正确性检验的测试工 ...

  3. 基于VUE2.0的分页插件(很好用,很简单)

    基于jQuery的分页插件很多,今天分享一下基于Vue的分页插件pagination.js,该插件使用用感觉很不错,简单不复杂,现将个人使用过程中的方法与遇到的问题以及实例分享出来. 下载解压的主要目 ...

  4. ORACLE常用系统查询

    目录(?)[-] 查询系统所有对象 查看系统所有表 查看所有用户的表 查看当前用户表 查看用户表索引 查看主键 查看唯一性约束 查看外键 查看表的列属性 查看所有表空间 查看oracle最大连接数 修 ...

  5. 记一次MSSQL到MySQL大数据迁移过程

    工作中遇到一个需求 要将MSSQL数据库中共计12张表的数据大概1000W行数据迁移到MySQL数据库中,去年另一个同事负责这件事情,他采用的方法是先将MSSQL数据库里的数据生成同MySQL数据库表 ...

  6. Ajax和SpringMVC之间JSON交互

    Ajax和SpringMVC之间的json数据传输有两种方式: 1.直接传输Json对象 2.将Json序列化成json字符串 1.直接传输Json对象 前端Ajax $(document).read ...

  7. BZOJ3864: Hero meet devil【dp of dp】

    Description There is an old country and the king fell in love with a devil. The devil always asks th ...

  8. JavaScript 之call , apply 和prototype 介绍

    1. 前言 为什么将这三个概念放在一起说.原因是这些是会在实现js 继承会需要使用到的 2. call 和 apply call 和 apply 的作用基本类似, 都是去执行function并将这个f ...

  9. .net core grpc 实现通信(一)

    现在系统都服务化,.net core 实现服务化的方式有很多,我们通过grpc实现客户端.服务端通信. grpc(https://grpc.io/)是google发布的一个开源.高性能.通用RPC(R ...

  10. test20181004 苹果树

    题意 分析 对每个点维护子树所能达到的dfn最大值.最小值.次大值.次小值,然后就可以计算原树中每个点与父亲的连边对答案的贡献. 如果子树中没有边能脱离子树,断掉该边与任意一条新加的边都成立,答案就加 ...