如何编写应用程序与USB HID 设备通讯(读写USB HID设备).pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《如何编写应用程序与USB HID 设备通讯(读写USB HID设备).pdf》由会员分享,可在线阅读,更多相关《如何编写应用程序与USB HID 设备通讯(读写USB HID设备).pdf(22页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、USB 学习板:EASY USB 51 PROGRAMER 配套光盘 主页地址:http:/ 淘宝网店:http:/ USB HID 设备通讯(读写设备通讯(读写 USB HID 设备)设备)说明:本实例所使用的上位机程序开发工具为 Visual C+6.0。一、修改下位机固件程序一、修改下位机固件程序 我们如果想实现一个 USB 的 HID 类设备,不需要在 Windows 下开发自己的驱动程序。HID不一定要是标准的外设类型,唯一的要求是交换的数据存储在报文的结构内,设备固件必须支持报文的格式。任何工作在该限制之内的设备都可以成为一个 HID,例如温度计、电压计、读卡机等。报文的格式是由报
2、告描述符决定的,所以只要修改描述符就能实现我们需要的报文格式。下面我们来实现一个简单的报文格式:上位机发送固定 64 字节数据给设备,这个数据可以是命令,也可是数据,具体含义并不是由报告描述符来决定的,是由开发人员事先约定好的。设备返回的数据也是 64 个字节,同样这个数据流的每个字节(甚至每个位)的具体含义由开发人员事先约定好。1、修改报告描述符 A、在 Descriptor.C 中找到以 MouseReportDescriptor 函数,将其内容修改如下:1.code char MouseReportDescriptor29=2.0 x06,0 x00,0 xFF,/USAGE_PAGE(
3、Vendor Defined Page 1)3.0 x09,0 x01,/USAGE(Vendor Usage 1)4.0 xA1,0 x01,/COLLECTION(Application)5.6.0 x19,0 x01,/(Vendor Usage 1)7.0 x29,0 x08,/(Vendor Usage 1)8.0 x15,0 x00,/LOGICAL_MINIMUM(0)9.0 x26,0 xFF,0 x00,/LOGICAL_MAXIMUM(255)10.0 x75,0 x08,/REPORT_SIZE(8)11.0 x95,0 x40,/REPORT_COUNT(64)12.0
4、 x81,0 x02,/INPUT(Data,Var,Abs)13.14.0 x19,0 x01,/(Vendor Usage 1)15.0 x29,0 x08,/(Vendor Usage 1)16.0 x91,0 x02,/OUTPUT(Data,Var,Abs)17.18.0 xC0 /END_COLLECTION 19.;此报告描述符定义了 64 个字节的输入输出数据。USB 学习板:EASY USB 51 PROGRAMER 配套光盘 主页地址:http:/ 淘宝网店:http:/ Descriptor.C 中的如下代码 1.0 x66,0 x03,/设备制造商定的产品 ID 修改为
5、 1.0 x66,0 x06,/设备制造商定的产品 ID C、在 Descriptor.h 中,将以下代码 1.extern code char MouseReportDescriptor52;修改为 1.extern code char MouseReportDescriptor29;D、在 Main.C 中找到以下代码 1.if(bEPPflags.bits.configuration)2.3./在这里添加端点操作代码 4.5.将其修改为 1.if(bEPPflags.bits.configuration)2.3./在这里添加端点操作代码 4.5.if(bEPPflags.bits.ep2
6、_rxdone)/主端点接收到数据(从主机发往设备的数据)6.7.bEPPflags.bits.ep2_rxdone =0;8.9.D12_WriteEndpoint(5,EP2_PACKET_SIZE,EpBuf);/立即将收到的 64 个字节发送到 PC 机 USB 学习板:EASY USB 51 PROGRAMER 配套光盘 主页地址:http:/ 淘宝网店:http:/ D12_WriteEndpoint 的定义位于 D12CI.C中。点击这里下载已修改好的源代码 2、测试 我们可以利用一些 USB 调试软件在自己没有编写上位机程序的情况下先进行一些测试。这里我们要用到的工具是BUS
7、HOUND。A、首先将第 1 步修改好的程序烧录到主控芯片中并将硬件插入电脑,然后打开 BUS HOUND,点“Settings”按钮切换到设置页,将“Max Phase”的值设为 64 并点“Apply”按钮,这样 BUS HOUND 才能监控最多 64 个字节的数据流。B、点“Devices”按钮切换到 Devices 页,选定我们刚插入的硬件(一定要选紧临“USB Root Hub”的下一级设备)。USB 学习板:EASY USB 51 PROGRAMER 配套光盘 主页地址:http:/ 淘宝网店:http:/ Commands”按钮,出现如下画面 USB 学习板:EASY USB 5
8、1 PROGRAMER 配套光盘 主页地址:http:/ 淘宝网店:http:/ 2,“Direction”为 Out 的那项,“Data Length”填 64,发送的数据随便填上一些数据,最后点击“Run”按钮 USB 学习板:EASY USB 51 PROGRAMER 配套光盘 主页地址:http:/ 淘宝网店:http:/ BUS HOUND 主界面,点“Capture”按钮切换到监控页面,如下图所示,BUS HOUND捕捉到了一些数据。其中“Phase”列中的“DO”代表主机发往设备的数据,而“DI”代表设备发往主机的数据。我们看到设备返回的数据正好和主机发送的数据一样,证明我们的下
9、位机程序已经修改成功。USB 学习板:EASY USB 51 PROGRAMER 配套光盘 主页地址:http:/ 淘宝网店:http:/ HID 设备的步骤设备的步骤 读写 HID 设备步骤如下:、得到系统 HID 设备结构数组指针、对设备进行遍历、得到指定 HID 设备的句柄、readfile/writefile 进行读写 下面分别对各步骤及其所涉及的相关 API 函数进行介绍。1、得到设备句柄:这步用到的两面个主要 API 函数原型为:A、通过以下函数 USB 学习板:EASY USB 51 PROGRAMER 配套光盘 主页地址:http:/ 淘宝网店:http:/ HidD_GetH
10、idGuid(OUT LPGUID HidGuid );得到 HID 设备的 GUID。B、再通过以下函数 1.HDEVINFO SetupDiGetClassDevs(2.CONST LPGUID ClassGuid,3.PCTSTR Enumerator,4.HWND hwndParent,5.DWORD Flags 6.);取得 HID 设备结构数组指针,以便下步得用这个数组对所有 HID 设备进行遍列。2、对设备进行遍历:遍历过程如下 A、首先利用以下函数:1.WINSETUPAPI BOOL WINAPI SetupDiEnumDeviceInterfaces(2.IN HDEVIN
11、FO DeviceInfoSet,3.IN PSP_DEVINFO_DATA DeviceInfoData OPTIONAL,4.IN LPGUID InterfaceClassGuid,5.IN DWORD MemberIndex,6.OUT PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData);运行此函数的主要目的是取得第一个参数 DeviceInfoSet 的填充值,又将此值作为以下函数 1.BOOL SetupDiGetDeviceInterfaceDetail(2.HDEVINFO DeviceInfoSet,3.PSP_DEVICE_INTE
12、RFACE_DATA DeviceInterfaceData,4.PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceInterfaceDetailData,5.DWORD DeviceInterfaceDetailDataSize,6.PDWORD RequiredSize,7.PSP_DEVINFO_DATA DeviceInfoData);USB 学习板:EASY USB 51 PROGRAMER 配套光盘 主页地址:http:/ 淘宝网店:http:/ eviceInterfaceDetailData 的填充值,然后利用这个值传递给 CreateFile 函数
13、,此时 CreateFile 会返回一个指向 HID 设备的句柄,再根据以下函数 1.BOOLEAN HidD_GetAttributes(2.IN HANDLE HidDeviceObject,3.OUT PHIDD_ATTRIBUTES Attributes 4.);取得此 HID 设备的属性(第二个参数的填充值),然后判断属性里的 PID(Attributes-ProductID)和 VID(Attributes-VendorID)是否是我们要查找的设备的 PID和 VID。PID 和 VID 在下位机固件代码的设备描述符里提供(设备描述里的 idProduct 域和idVendor,参
14、考百合电子工作室发表的文章USB 开发基础USB 命令(请求)和 USB 描述符一文中表 4),当然您也可以通过一些工具查询得到 PID 和 VID,您可以到 USB 组织官方网站 www.usb.org 下载这类工具。3、根据得到的设备句柄利用 ReadFile 和 WriteFile 对设备进行读写操作。百合电子工作室已经将以上步骤封装成了一个 HID 类(参考了其它一些实例代码),它能实现对指定 PID 和 VID 设备的查找,并实现了数据收发功能,同时具有设备拨插检测通知功能。点击这里下载 下面用实例说明如何使用这个类。四、读写四、读写 HID 设备实例设备实例 实例实例 1 1、找开
15、 Visual C+6.0,新建一基于 MFC 的工程名为:Easy USB 51 Programer Test1。USB 学习板:EASY USB 51 PROGRAMER 配套光盘 主页地址:http:/ 淘宝网店:http:/ AppWizard Step 1 对话框中选择基于对话框的应用程序,然后点“Finish”按钮,如图所示:USB 学习板:EASY USB 51 PROGRAMER 配套光盘 主页地址:http:/ 淘宝网店:http:/ 3 个静态文本标签(Static Text),文本内容分别为:Write、Read 和 Message;创建两个文本框和一个列表框,ID 分别
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 如何编写应用程序与USB HID 设备通讯读写USB HID设备 如何 编写 应用程序 USB 设备 通讯 读写
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内