USB接口程序编写
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接口程序编写的更多相关文章
- Linux驱动之USB鼠标驱动编写
本篇博客分以下几部分讲解 1.介绍USB四大描述 2.介绍USB鼠标驱动程序功能及框架 3.介绍程序用到的结构体 4.介绍程序用到的函数 5.编写程序 6.测试程序 1.介绍USB四大描述符 USB设 ...
- 20151009 C# 第一篇 程序编写规范
20151009 程序编写规范 1. 代码书写规则: 1).尽量使用接口,然后使用类实现接口. 2).关键语句写注释 3).避免写超过5个参数的方法,如果要传递多个参数,则使用结构 4).避免代码量过 ...
- [转]支付宝接口程序、文档及解读(ASP.NET)
本文转自:http://www.cnblogs.com/blodfox777/archive/2009/11/03/1595223.html 最近需要为网站加入支付宝的充值接口,而目前关于支付宝接口开 ...
- Android Camera 相机程序编写
Android Camera 相机程序编写 要自己写一个相机应用直接使用相机硬件,首先应用需要一个权限设置,在AndroidManifest.xml中加上使用设备相机的权限: <uses-per ...
- 基于Asterisk的VoIP开发指南——(2)Asterisk AGI程序编写指南
原文:基于Asterisk的VoIP开发指南--(2)Asterisk AGI程序编写指南 5. Asterisk AGI程序编写指南 5.1概述 很多时候,我们需要在拨号方案中做某些业务逻辑的判断或 ...
- rockchip 3128 平台USB接口鼠标U盘功能调试日记
2019-04-12 关键词: rk3128 OTG.rk3128外接鼠标U盘.RK外接鼠标U盘 本篇文章是笔者根据自己当前所掌握知识对 rk3128 平台 USB 接口接鼠标实现输入功能调试的一个记 ...
- 直接端口打印 支持USB接口的打印机吗?解决办法
直接端口打印 支持USB接口的打印机吗?解决办法 www.MyException.Cn 网友分享于:2013-09-15 浏览:488次 直接端口打印 支持USB接口的打印机吗?问题如 ...
- 支付宝接口程序、文档及解读(ASP.NET)
最近需要为网站加入支付宝的充值接口,而目前关于支付宝接口开发的资料比较杂乱,这里就我此次开发所用到的资料进行汇总整理,希望能够帮助需要的朋友. 开发步骤: 1. 确定签约类型 支付宝的接口有多种类型, ...
- Mathcad 是一种工程计算软件,主要运算功能:代数运算、线性代数、微积分、符号计算、2D和3D图表、动画、函数、程序编写、逻辑运算、变量与单位的定义和计算等。
Mathcad软件包Mathcad是由MathSoft公司(2006 年4 月被美国PTC收购)推出的一种交互式数值计算系统. Mathcad 是一种工程计算软件,作为工程计算的全球标准,与专有的计算 ...
随机推荐
- magento如何在首页显示产品
1.首先现在magento后台创建一个新的分类,记下这个分类的 ID 号码.使用这个新建的分类来管理你的首页产品,这个分类设置为前台不可见.这样就不会显示在你的分类菜单中了,但使用代码调用的时候却会显 ...
- css怎么让li水平排列和div居中
让li向左浮动即可 给div定一个宽度,然后margin:0 auto;即可:
- [LeetCode&Python] Problem 872. Leaf-Similar Trees
Consider all the leaves of a binary tree. From left to right order, the values of those leaves form ...
- Math对象的属性和方法
Math对象是js提供给我们用于运算的方法的集合.若进行数学逻辑上不允许的运算,返回NaN. 属性:Math.E 返回算数常量e(2.718281828459045) Math.LN2 返回2的自然对 ...
- 【HAOI2014】贴海报
弱省中的弱省……原题: Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委员会为选民准备了一个张贴海报的electoral墙.张贴规则如下:1 ...
- MySQL Inception--原理和注意事项
========================================================= MySQL Inception原理图 ======================= ...
- Apache和Nginx的Rewrite规则对比
一.Apache的rewrite 1.Rewrite规则简介: Rewirte主要的功能就是实现URL的跳转,它的正则表达式是基于Perl语言.可基于服务器级的(httpd.conf)和目录级的(.h ...
- baidu手机浏览器安卓4.5版公布:由于快,所以爱
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDUyMzk4OA==/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- java 多线程之 interrupt()和线程终止方式
interrupt() 说明 interrupt()的作用是中断本线程. 本线程中断自己是被允许的:其它线程调用本线程的interrupt()方法时,会通过checkAccess()检查权限.这有可能 ...
- nginx 官方docker镜像使用教程
最近在看nignx,在本地虚拟机使用docker nginx镜像搭建了nginx+php环境 整理的教程如下: 拉取nginx镜像docker pull nginx 创建一个容器,并挂载本地目录doc ...