一、引言
本文介绍了USB设备中的人机接口,HID设备与主机通信的要点与方式。详细讲解了在VB中调用相关APl函数的方法,并介绍了一种基于USB总线的数据采集系统的设计方案及开发方法,采用的是USB2.0协议。该系统主要是从设备的角度描述了人机接口设备通信,以及用来与主机进行数据交换的报告格式。应用程序可以使用任何能访问API函数的编程语言,调用窗口函数并与USB设备实现通信。掌握USB设备与计算机通讯规程,实现USB设备的自动识别。为数据采集系统与计算机之间的通讯开辟了新的道路。
这几年,随着大量支持USB的个人电脑的普及,USB逐步成为PC机的标准接口已经是大势所趋了。在主机(host)端,最新推出的PC机几乎100%支持USB;而在外设(device)端,使用USB接口的设备也与日俱增,例如数码相机、扫描仪、游戏杆、磁带和软驱、图像设备、打印机、键盘、鼠标等。
二、Windows系统选择USB驱动的过程
当Windows检测到一个新的USB外设时,必须做的一件事情是找出应该使用哪个设备驱动应用软件来与设备通信,然后载入选定的驱动。这是Windows设备管理器的工作,设备管理器使用类、设备安装器和INF文件来找到这个匹配。
INF文件是一个文本文件,其中包括有利于Windows识别设备的信息。文件告诉Win-dows要使用什么驱动、注册表里存储什么信息等。
三、Visual Basic与USB设备通信的设计与实现
使用VB语言访问串行通信接口的方法。Windows在底层实现了和串行通信有关的很多复杂的工作,给程序员提供了一个相对比较容易掌握的编程接口。例如Windows自动将所有接收到的字符放到接收缓冲区中,而所有发送的字符也都进入发送缓冲区。只要程序空闲,程序就可以读取接收缓冲区获得数据,或者向发送缓冲区发送数据。
1.主机寻找USB设备的过程
第一个被Windows支持的USB外围设备类是人机接口设备。HID是HUMANINTER-FACE DEVICE人机接口设备的英文缩写。是指直接和人进行互动的设备。如鼠标、键盘等。运行在WINDOWS98或其他更高的版本的操作系统的PC机,系统除了提供通用的USB设备的底层驱动以外,还单独提供了一些HID设备的完整驱动,应用程序可以很容易地与操作系统内部的HID通讯。这样使得符合HID类的USB设备很容易开发与运行。也就是说,我们如果想实现一个USB的HID类设备,是不需要在Windows下开发自己的驱动程序的。HID不一定要是标准的外设类型,唯一的要求是交换的数据存储在报文的结构内,设备固件必须支持报文的格式。任何工作在该限制之内的设备都可以成为一个HID,例如温度计、电压计、读卡机等。
2.VB中调用API函数的过程
(1)声明:下面是一个Visual Basic使用API函数WriteFile的声明:可以利用这个涵数来写数据到HID(也可以是文件和其他设备)中。Public Declare Function WriteFile Lib_“kernel32”_
(By Val hFile As Long,_ByReflpBuffer As Byte,_By Val nNumberOfBytes To Write As Long,_ByRef lpNumberOfBytesWritten As Long,_ByVal lpOvefiapped As Long)_As Long
(2)识别HID过程Public Declare Function HidD_GetHidGuid Lib_“hid.dll”_(ByRefHidGuid As GUID)As Long
3.Visual Basic数据过程
(1)读数据到设备
Public Declare Function WriteFile Lib“kernel32”_(ByVal hFile As Long,_ByReflpBuffer As Byte_ByValnNumberOfBytesToWrite As Long,_ByRefnNumberOfBytcsWritten As Long,_ByVal lpOvefiapped As Long)_As Long
(2)从设备读取数据Declare Function ReadFile Lib_“kernel32”_(ByValhFile As Long,_ByReflpBuffer As Byte,_ByValnNumberOfBytesToRead As Long,_ByReflpNumberOfBytesRead As Long,_lpOvefiapped As Long)_As Long
读写报文缓冲区时,第一个字节是ReportID,其后是报文数据。报文缓冲区默认是八个报文,并且环状排列。因为数据读写是发生在主机轮训设备的时候,并不是由设备触发产生硬件中断,所以如不能及时读写,新的数据会覆盖旧的数据,导致报文丢失。当数据读写频繁时应使用特征报文,它可以保证当报文数据没有变化时,HID不会传送新的数据。
当不再使用SetupDiGetClassDevs时,应用上述函数释放其返回的数组hDevInfo。还有需要使用函数CloseHandle,它是一个非常通用的API函数,可以用于关闭通信。
四、结论
本文介绍了USB设备中的人机接口,HID设备与主机通信的要点与方式。详细讲解了在VB中调用相关APl函数的方法,并介绍了一种基于USB总线的数据采集系统的设计方案及开发方法,采用的是USB2.0协议。该系统主要是从设备的角度描述了人机接口设备通信,以及用来与主机进行数据交换的报告格式。应用程序可以使用任何能访问API函数的编程语言,调用窗口函数并与USB设备实现通信。掌握USB设备与计算机通讯规程,实现USB设备的自动识别。为数据采集系统与计算机之间的通讯开辟了新的道路。
这几年,随着大量支持USB的个人电脑的普及,USB逐步成为PC机的标准接口已经是大势所趋了。在主机(host)端,最新推出的PC机几乎100%支持USB;而在外设(device)端,使用USB接口的设备也与日俱增,例如数码相机、扫描仪、游戏杆、磁带和软驱、图像设备、打印机、键盘、鼠标等。
二、Windows系统选择USB驱动的过程
![](https://i-blog.csdnimg.cn/blog_migrate/b706dff909853a830e0e2e93ca40da04.png)
当Windows检测到一个新的USB外设时,必须做的一件事情是找出应该使用哪个设备驱动应用软件来与设备通信,然后载入选定的驱动。这是Windows设备管理器的工作,设备管理器使用类、设备安装器和INF文件来找到这个匹配。
INF文件是一个文本文件,其中包括有利于Windows识别设备的信息。文件告诉Win-dows要使用什么驱动、注册表里存储什么信息等。
三、Visual Basic与USB设备通信的设计与实现
使用VB语言访问串行通信接口的方法。Windows在底层实现了和串行通信有关的很多复杂的工作,给程序员提供了一个相对比较容易掌握的编程接口。例如Windows自动将所有接收到的字符放到接收缓冲区中,而所有发送的字符也都进入发送缓冲区。只要程序空闲,程序就可以读取接收缓冲区获得数据,或者向发送缓冲区发送数据。
1.主机寻找USB设备的过程
第一个被Windows支持的USB外围设备类是人机接口设备。HID是HUMANINTER-FACE DEVICE人机接口设备的英文缩写。是指直接和人进行互动的设备。如鼠标、键盘等。运行在WINDOWS98或其他更高的版本的操作系统的PC机,系统除了提供通用的USB设备的底层驱动以外,还单独提供了一些HID设备的完整驱动,应用程序可以很容易地与操作系统内部的HID通讯。这样使得符合HID类的USB设备很容易开发与运行。也就是说,我们如果想实现一个USB的HID类设备,是不需要在Windows下开发自己的驱动程序的。HID不一定要是标准的外设类型,唯一的要求是交换的数据存储在报文的结构内,设备固件必须支持报文的格式。任何工作在该限制之内的设备都可以成为一个HID,例如温度计、电压计、读卡机等。
2.VB中调用API函数的过程
(1)声明:下面是一个Visual Basic使用API函数WriteFile的声明:可以利用这个涵数来写数据到HID(也可以是文件和其他设备)中。Public Declare Function WriteFile Lib_“kernel32”_
(By Val hFile As Long,_ByReflpBuffer As Byte,_By Val nNumberOfBytes To Write As Long,_ByRef lpNumberOfBytesWritten As Long,_ByVal lpOvefiapped As Long)_As Long
(2)识别HID过程Public Declare Function HidD_GetHidGuid Lib_“hid.dll”_(ByRefHidGuid As GUID)As Long
3.Visual Basic数据过程
(1)读数据到设备
Public Declare Function WriteFile Lib“kernel32”_(ByVal hFile As Long,_ByReflpBuffer As Byte_ByValnNumberOfBytesToWrite As Long,_ByRefnNumberOfBytcsWritten As Long,_ByVal lpOvefiapped As Long)_As Long
(2)从设备读取数据Declare Function ReadFile Lib_“kernel32”_(ByValhFile As Long,_ByReflpBuffer As Byte,_ByValnNumberOfBytesToRead As Long,_ByReflpNumberOfBytesRead As Long,_lpOvefiapped As Long)_As Long
读写报文缓冲区时,第一个字节是ReportID,其后是报文数据。报文缓冲区默认是八个报文,并且环状排列。因为数据读写是发生在主机轮训设备的时候,并不是由设备触发产生硬件中断,所以如不能及时读写,新的数据会覆盖旧的数据,导致报文丢失。当数据读写频繁时应使用特征报文,它可以保证当报文数据没有变化时,HID不会传送新的数据。
当不再使用SetupDiGetClassDevs时,应用上述函数释放其返回的数组hDevInfo。还有需要使用函数CloseHandle,它是一个非常通用的API函数,可以用于关闭通信。
四、结论
实际编程表明使用VB开发HID类USB设备是一条非常方便快捷的途径,不需要编写底层驱动,涉及到的API函数多是大家熟知的通用函数。但同时还必须注意到一点,HID类只支持控制传输与中断传输。控制传输通常不用于数据的传输,而中断传输的特点是保证最大延迟,也就是事务之间的时间。它没有保证传输速率,而是保证每笔事务之间的时间不会超过最大延时。所以中断传输适用于数据量不太大,但需要及时快速地传送,实时性要求较高的场合。对于数据量比较大的传输,是不宜使用中断传输的。因此HID设备应用的场合也必须根据该特点灵活使用。