USB是目前发展应用非常广泛的一项技术。它是一种计算机系统连接外围设备的标准输入/输出接口。根据外围设备的不同的类型USB协议将其分类,每个设备类型都定义了类似功能设备的共同行为和协议。相同类型的设备都由一组标准定义的功能模块组成。这样主机与USB设备之间的通信就可以通过一些标准格式的数据包来完成。USB开发者论坛发布了一系列USB设备的类型定义控制工程网版权所有,并配以相应的使用说明。下面表格显示出 USB的设备类型(DEVEICE CLASS):
表1 USB的设备类型
虽然Windows已经提供了底层总线操作的驱动程序,但与此类底层驱动程序接口的是i/o请求包的IRPs的结构,而Windows为应用程序提供的接口是API函数。因此必须在其间建立一个驱动程序,在USB底层驱动与Windows应用程序之间传递消息。VB、 C/C++、Delphi等通用编程语言编写的应用程序都可以在设备驱动程序的支持下控制工程网版权所有,调用Readfile、WriteFile、DeviceIoControl等API函数。而编写底层总线的驱动程序是非常复杂的一项工程。为了消除编写设备驱动程
2 HID类型概述
第一个被windows支持的usb外围设备类是人机接口设备。hid是human interface device人机接口设备的英文缩写。是指直接和人进行互动的设备。如鼠标、键盘等。运行在WINDOWS98或其他更高的版本的操作系统的PC机,系统除了提供通用的USB设备的底层驱动以外,还单独提供了一些HID设备的完整驱动,应用程序可以很容易的与操作系统内部的hid通讯。这样使得符合hid类的USB设备很容易开发与运行。也就是说,我们如果想实现一个USB的HID类设备,是不需要在Windows下开发自己的驱动程序。HID不一定要是标准的外设类型,唯一的要求是交换的数据存储在报文的结构内,设备固件必须支持报文的格式。任何工作在该限制之内的设备都可以成为一个hid,例如温度计,电压计,读卡机等。
hid类设备只能使用控制传输与中断传输两种方式。HID的交换的数据格式称为报文。报文形式灵活控制工程网版权所有,能处理任何类型的数据。HID特有的请求,Set_Report和Get_Report为主机和设备之间的任何类型数据块传输提供了一种方法。主机发出Get_Report请求,设备响应向主机传送数据块;主机发出Set_Report请求,设备响应准备接收主机发出的数据块。对于一个全速设备,中断传输方式下每笔事务能够传送的最大数据量是64字节,全速设备每毫秒不能有超过一笔事务,所以每秒最多传送64000字节。高速设备,每笔事务能够传送的最大数据量是1024字节。对于不能一次传输完毕的数据,接收和发送报文可以采用多笔事务。
表2列举出了与HID类设备通信过程中使用到的大量函数,这些函数的用法在DDK的帮助文档中均有详细地解释。这些函数包含在Hid.dll、Setupapi.dll、Kernel32.dll三个动态链接库中,分别起到与HID设备通讯,寻找与识别设备,交换数据的作用。
表2 HID设备通信相关API函数
Visual Basic编程语言,语法简单用法灵活易于掌握。用它来开发通信程序是一种非常快捷的途径。但是需要指出的是,API函数的声明格式在DDK的文档内全部是采用C语言的格式声明,而VB与C语言的在变量的声明、存储格式上都有很大的区别。所以首先需要进行类型转换,例如CHAR转换为Byte类型, USHORT、ULONG、BOOLEAN、LP_(长指针前缀)、P_(指针前缀)转换为Long 类型,PCTSTR转换为String类型。其次,C语言的结构体可以转换为VB中的自定义数据类型,并且特别值得注意,在涉及到自定义数据类型中子类存储位置必须注意到VB与C语言对应转换类型所占内存空间不同的问题。最后C语言中有指针的概念,而VB中没有,所以需用Byref按地址传递控制工程网版权所有,VarPtr取变量地址等方法进行相应的操作。
3 VB中调用API函数详述
第一步需要获得GUID(global unique identifier),需要调用函数 HidD_GetHidGuid ,他在可以如下定义:
Public Declare Function HidD_GetHidGuid Lib_
"hid.dll" _
(ByRef HidGuid As GUID)
As