zoukankan      html  css  js  c++  java
  • 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函数可以更改正在进行的读写操作方式

     

    作者:长风 Email:844064492@qq.com QQ群:607717453 Git:https://github.com/zhaohu19910409Dz 开源项目:https://github.com/OriginMEK/MEK 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利. 感谢您的阅读。如果觉得有用的就请各位大神高抬贵手“推荐一下”吧!你的精神支持是博主强大的写作动力。 如果觉得我的博客有意思,欢迎点击首页左上角的“+加关注”按钮关注我!
  • 相关阅读:
    android pcm
    mongo DB的一般操作
    使用SQL Server 扩展事件来创建死锁的时间跟踪
    sql 日期格式汇总
    简述SQL2008部署多实例集群(学习)
    数据库压缩备份提高备份效率
    SSRS报表连接超时的问题
    classLoader.getResourceAsStream中文乱码
    jQuery与js对象互转
    sqlserver判断字段是否存在更改字段
  • 原文地址:https://www.cnblogs.com/zhaohu/p/7082478.html
Copyright © 2011-2022 走看看