Windows主机端与自定义USBHID设备通信详解讲解
USB_HID协议中文版——USB接口HID设备
USB_HID协议中文版——USB接口HID设备
一、什么是USBHID协议
USB HID(Human Interface Device)协议是一种应用在USB接口上
的应用层通信协议,它不仅定义了用于特定应用的设备的接口规范,而且
可以帮助开发者更快捷、更准确地实现其产品化。
USB HID是USB接口应用层通信协议中最常用的一种协议,它通过主
机和设备之间的endpoints来建立简单的通信框架,从而实现设备连接和
输入输出控制。最初被设计用于用户界面(如鼠标、键盘等),但它的应
用领域已经不仅限于此,无论是电源管理控制、温度控制器、读卡器、按键、触摸板或其他交互式设备,都可以通过USB HID来实现。
二、USBHID协议框架
USBHID协议规范定义了主机与设备之间的通信机制,其使用形式类
似于USB驱动程序,主要有以下几个部分:
1、Device Definition:描述支持HID协议的设备的特性,包括设备
所具备的功能,如鼠标按键、键盘、触摸板等;
2、Descriptor:定义设备的接口,描述设备与用户界面之间的结构
关系;
3、Report Descriptor:描述报告的格式,定义HID设备的所有输入
和输出数据;
4、Input Report:指从键盘、鼠标、按钮等设备向主机发送的数据;
5、Output Report:指从主机向设备发送的数据,以从设备更改状态
或进行其他操作;
6、Feature Report:当输入输出数据不足以满足需求时。
windows hid原理
windows hid原理
Windows HID(Human Interface Device)原理涉及操作系统与输入设备之间的交互。HID是一种通用的设备类别,包括键盘、鼠标、游戏手柄等。Windows操作系统通过HID协议与这些设备进行通信。
在Windows中,HID设备通过设备驱动程序与操作系统进行通信。当用户操作键盘或鼠标时,设备会生成相应的信号,通过USB 或蓝牙等接口传输到计算机。操作系统的HID驱动程序会接收这些信号,并将其转换成操作系统能够理解的输入数据。
HID设备发送的数据通常是一系列的报文,其中包含了设备类型、按键状态、鼠标移动信息等。Windows操作系统的HID驱动程序会解析这些报文,然后将其转换成对应的输入事件,比如键盘按键按下、鼠标移动等。
一旦操作系统接收到这些输入事件,它会将其传递给相应的应用程序或者系统组件进行处理。比如,键盘输入会传递给当前获得焦点的应用程序,鼠标移动则会影响鼠标指针在屏幕上的位置等。
总的来说,Windows HID原理涉及操作系统通过HID驱动程序与输入设备进行通信,将设备发送的数据转换成操作系统能够理解的输入事件,最终传递给应用程序或系统组件进行处理。这种交互过程保证了用户能够通过各种HID设备与计算机进行交互操作。
USBHID协议中文版__USB接口HID设备
USBHID协议中文版__USB接口HID设备##USBHID协议
USBHID协议(Universal Serial Bus Human Interface Device)是
USB设备的一种常用协议,它主要用于连接和控制人与计算机的交互设备,如键盘、鼠标、游戏手柄、虚拟摇杆、扫描仪和图形表格等设备。它主要
用于USB设备的连接和控制,以及电脑上支持的操作系统,如Windows、Mac OS、Linux。
USBHID协议使用HID类设备来提高人机交互的效率,有效地减少计
算机程序的数据处理时间。使用HID类设备的程序可以实时地进行输入,
计算机也可以实时地反馈反应。通过使用HID类设备,可以有效地提高用
户体验。
USBHID协议具有许多优点,如:支持所有兼容USB的操作系统,不
需要额外的驱动程序,可以支持各种类型的HID设备,延长设备的稳定性,减少传输延迟,减少接口占用,支持许多不同的传输速率,可以支持许多
不同的设备和设备类型,支持多种接口,支持大量的数据通信,以及减少
计算机程序数据处理时间等优点。
另外,USBHID协议也给使用这些设备带来了极大的便利,如:可以
将设备连接到计算机,让设备能够立即响应输入;可以使用设备时装载更
多的功能;可以在多个设备之间进行快速传输;可以有意识地管理电源;
可以支持多种设备,如跳线选择器。
Windows主机端与自定义USB HID设备通信详解
Windows主机端与自定义USB HID设备通信详解 (2009-06-12 23:19)
分类:Windows
说明:
-以下结论都是基于Windows XP系统所得出的,不保证在其他系统的适用性。-在此讨论的是HID自定义设备,对于标准设备,譬如USB鼠标和键盘,由于操作系统对其独占,许多操作未必能正确执行。
1.所使用的典型Windows API
CreateFile
ReadFile
WriteFile
以下函数是DDK的内容:
HidD_SetFeature
HidD_GetFeature
HidD_SetOutputReport
HidD_GetInputReport
其中,CreateFile用于打开设备;ReadFile、HidD_GetFeature、
HidD_GetInputReport用于设备到主机方向的数据通信;WriteFile、
HidD_SetFeature、HidD_SetOutputReport用于主机到设备方向的数据通信。鉴于实际应用,后文主要讨论CreateFile,WriteFile,ReadFile,HidD_SetFeature四个函数,明白了这四个函数,其它的可以类推之。
2.几个常见错误
当使用以上API时,如果操作失败,调用GetLastError()会得到以下常见错误:
6:句柄无效
23:数据错误(循环冗余码检查)
87:参数错误
1784:用户提供的buffer无效
后文将会详细说明这些错误情况。
3.主机端设备枚举程序流程
4.函数使用说明
CreateFile(devDetail->DevicePath, //设备路径
USB的HID通信协议
USB的HID通信协议
USB的HID(Human Interface Device)通信协议是一种用于连接计算机和外部人机交互设备的通信协议。HID协议定义了计算机和设备之间的数据传输格式、数据解释和通信流程,以实现设备的控制和数据交换。下面将详细介绍USB的HID通信协议。
B的HID通信协议基本概念:
USB的HID通信协议是在USB(Universal Serial Bus)标准之上定义的一种通信协议。USB是一种高速串行总线标准,提供了与设备进行通信的硬件接口。而HID通信协议定义了在USB接口上进行人机交互设备通信的规则和格式。
2.HID通信协议的数据传输格式:
HID通信协议使用报文的方式进行数据传输。每个报文由一个报头和一个或多个数据包组成。报头包含了指示报文类型、报文长度等信息,数据包中存放实际的数据。通常情况下,报文的数据是按字节进行传输的,但对于特定类型的设备,也可以使用其他格式进行传输。
3.HID通信协议的数据解释:
HID通信协议定义了一种标准的数据解释方式,以便计算机能够正确地解释设备发送的数据。例如,在鼠标设备中,数据包中的前2个字节表示鼠标的横坐标和纵坐标的变化量。计算机根据这些数据来控制鼠标的移动。
4.HID通信协议的通信流程:
HID通信协议规定了在设备和计算机之间进行通信的具体流程。在通
信开始前,设备必须向计算机发送设备描述符以告知其设备的类型和功能。计算机收到设备描述符后,会根据描述符中的信息来设置相应的数据报文
格式和解释方式。设备在工作过程中,会根据HID协议规定的规则和格式
hid协议
HID协议
HID(Human Interface Device)协议是一种用于计算机与人机交互设备之间通信的协议。它定义了计算机如何与键盘、鼠标、游戏手柄等输入设备进行通信,以及如何接收和处理来自这些设备的输入信息。HID协议被广泛应用于各种操作系统和硬件平台中,为用户提供了良好的输入设备兼容性和可靠性。
HID协议的基本原理
HID协议使用了一种称为报告(Report)的数据结构进行通信。报告是一种特定格式的数据包,用于携带输入设备发送的信息。在HID协议中,输入设备被称为HID设备,输出设备被称为HID主机。HID主机通过发送请求来从HID设备获取报告,而HID设备则通过发送报告来向HID主机发送输入信息。
HID协议中定义了两种类型的报告:输入报告和输出报告。输入报告用于向HID主机发送输入数据,比如按键信息、鼠标移动等。而输出报告用于向HID设备发送控制命令,比如控制LED灯的亮度、设置鼠标灵敏度等。
HID协议的具体实现
HID协议的具体实现方式因不同的操作系统和硬件平台而异。以下以Windows 操作系统为例,介绍HID协议的具体实现过程。
在Windows操作系统中,HID协议的实现主要涉及到以下几个方面:
1.设备识别:当插入一个HID设备时,Windows会自动识别设备并加
载相应的驱动程序。驱动程序是用来将HID设备的输入信息转换为操作系统能够理解的格式。
2.报告描述:HID设备需要提供一个报告描述符,用于描述设备支持的
报告类型和报告格式。报告描述符通常以二进制格式存储在设备的固件中,并在设备插入时由操作系统读取。
USBHID设备报告描述符详解
USBHID设备报告描述符详解
USBHID设备报告描述符是一种描述USBHID设备报告的结构,用于定义设备报告的输入输出特性,允许设备与控制器的主机通信。通常,报告描述符是一段二进制数据,其中包含由设备提供的输入和输出报告,以及描述报告的数据结构要求信息。它是一种混合结构,由多个子块组成,每个子块又由一个或多个报告描述符中的域组成。
报告描述符的结构如下:
报告描述符
-
-bLengt
-bDescriptorTyp
-wDescriptorLengt
-数据
-输入报
-输出/特殊报
-特殊报
头部:报告描述符的头部包括三个字段:报告描述符的字节长度(bLength),报告描述符类型(bDescriptorType)和报告描述符的总长度(wDescriptorLength)。
bLength:报告描述符的字节长度,是报告描述符数据的字节数。
bDescriptorType:报告描述符类型,用于指示报告描述符的类型,必须为0x22
wDescriptorLength:报告描述符的总长度,用于指示报告描述符的总字节数。
数据段:数据段包括输入报告、输出/特殊报告和特殊报告。
输入报告:输入报告用于获取主机发送到设备的数据,一般由设备按定义的格式读取。
输出报告:输出报告用于将设备发送到主机的数据。
hid_精品文档
hid
HID(Human Interface Device)文档
1. 简介
HID,即人机界面设备,是一种用于与计算机交互的输入和输出
设备。它是通过人体操作来控制计算机系统的工具或装置,如键盘、鼠标、游戏手柄等。HID作为一种标准化协议,定义了这些设备与
计算机之间的通信规则和数据格式。本文档将介绍HID的定义、应用领域、协议规范以及常见的HID设备。
2. HID的定义
HID是一种用于数据交互的设备协议,最初由微软和英特尔联合
开发并于1996年发布。该协议旨在统一计算机系统与各种输入输
出设备之间的通信方式,为用户提供更好的操作体验。HID设备通
过USB、蓝牙等接口与计算机连接,实现数据传输与交互。
3. HID的应用领域
HID协议广泛应用于各种交互设备中,包括但不限于以下领域:
- 计算机输入设备:包括键盘、鼠标、触摸板等;
- 游戏控制器:如手柄、方向盘、飞行杆等;
- 数字音频设备:如音量调节器、音频接口等;
- 医疗器械:如心率监测仪、血压计等;
- 工业自动化设备:如机器人控制器、传感器等。
4. HID协议规范
HID协议定义了HID设备与计算机之间的通信方式,主要包括以下几个方面:
- 报告描述:HID设备通过向计算机发送报告来传输数据。报告
描述定义了报告的结构和数据格式,以及报告与功能之间的映射关系。
- 设备描述:HID设备通过设备描述符向计算机发送信息,包括
设备类型、功能等。计算机根据设备描述来正确识别和操作HID设备。
- 识别码:每个HID设备都有一个唯一的识别码,用于在系统中
标识设备。计算机根据设备的识别码来识别和管理HID设备。
USB接口HID设备说明书
第8章USB接口HID设备
HID(Human Interface Device,人机接口设备)是USB设备中常用的设备类型,是直接与人交互的USB设备,例如键盘、鼠标与游戏杆等。在USB设备中,HID设备的成本较低。另外,HID设备并不一定要有人机交互功能,只要符合HID类别规范的设备都是HID 设备。
Wndows操作系统最先支持的HID设备。在windows 98以及后来的版本中内置有 HID 设备的驱动程序,应用程序可以直接使用这些驱动程序来与设备通信。
在设计一个USB接口的计算机外部设备时,如果HID类型的设备可以满足需要,可以将其设计为HID类型设备,这样可以省去比较复杂的USB驱动程序的编写,直接利用Windows 操作系统对标准的HID类型USB设备的支持。
8.1HID设备简介
8.1.1HID设备的特点
交换的数据储存在称为报表(Report)的结构内,设备的固件必须支持HlD报表的格式。主机通过控制和中断传输中的传送和请求报表来传送和接收数据。报表的格式非常灵活。
每一笔事务可以携带小量或中量的数据。低速设备每一笔事务最大是8B,全速设备每一笔事务最大是64B,高速设备每一笔事务最大是1024B。一个报表可以使用多笔事务。
设备可以在未预期的时间传送信息给主机,例如键盘的按键或是鼠标的移动。所以主机会定时轮询设备,以取得最新的数据。
HID设备的最大传输速度有限制。主机可以保证低速的中断端点每10ms内最多1笔事务,每一秒最多是800B。保证全速端点每lms一笔事务,每一秒最多是64000B。
如何编写应用程序与USBHID设备通讯
如何编写应用程序与USBHID设备通讯
编写应用程序与USBHID设备通讯的过程可以分为以下几个步骤:设
备初始化、数据读取与写入以及释放资源。下面将详细介绍如何完成每个
步骤。
1.设备初始化:
首先,需要获取系统中的所有HID设备信息,并找到目标设备的相关
信息,如厂商ID、产品ID等。可以使用操作系统提供的API函数来实现
这一步骤,例如,Windows系统可以使用SetupAPI、DeviceIoControl等
函数来获取设备信息。
2.打开设备:
找到目标设备后,需要使用操作系统提供的API函数打开设备。在Windows系统下,使用CreateFile函数打开设备句柄。在Linux系统下,可以通过打开特定的文件来获取设备句柄。
3.读取数据:
打开设备后,可以使用ReadFile函数从设备中读取数据。需要设置
好读取的缓冲区大小和读取的超时时间等相关参数。读取的数据通常以报
文形式传输,需要根据设备的通信协议进行解析和处理。
4.写入数据:
使用WriteFile函数将数据写入设备。写入的数据也通常以报文形式
进行传输,需要按照设备的通信协议来填充报文的内容。
5.释放资源:
通信完成后,需要关闭设备句柄并释放相关资源。在Windows系统下,使用CloseHandle函数关闭设备句柄;在Linux系统下,使用close函数
关闭设备文件描述符。
总结起来,编写应用程序与USBHID设备通讯的过程包括设备初始化、打开设备、读取数据、写入数据以及释放资源等步骤。具体实现过程需要
根据操作系统和编程语言的不同而有所调整,但总体思路相似。通过调用
如何编写应用程序与USB HID 设备通讯(读写USB HID设备)
如何编写应用程序与USB HID 设备通讯(读写USB HID设备)说明:本实例所使用的上位机程序开发工具为Visual C++6.0。
一、修改下位机固件程序
我们如果想实现一个USB的HID类设备,不需要在Windows下开发自己的驱动程序。HID 不一定要是标准的外设类型,唯一的要求是交换的数据存储在报文的结构内,设备固件必须支持报文的格式。任何工作在该限制之内的设备都可以成为一个HID,例如温度计、电压计、读卡机等。
报文的格式是由报告描述符决定的,所以只要修改描述符就能实现我们需要的报文格式。下面我们来实现一个简单的报文格式:上位机发送固定64字节数据给设备,这个数据可以是命令,也可是数据,具体含义并不是由报告描述符来决定的,是由开发人员事先约定好的。设备返回的数据也是64个字节,同样这个数据流的每个字节(甚至每个位)的具体含义由开发人员事先约定好。
1、修改报告描述符
A、在Descriptor.C中找到以MouseReportDescriptor函数,将其内容修改如下:
1.code char MouseReportDescriptor[29] = {
2. 0x06,0x00,0xFF, //USAGE_PAGE (Vendor Defined Page 1)
3. 0x09,0x01, //USAGE (Vendor Usage 1)
4. 0xA1,0x01, //COLLECTION (Application)
5.
6. 0x19,0x01, //(Vendor Usage 1)
USBHID协议
USBHID协议
USB HID(Human Interface Device)是一种USB设备类别,用于连
接和通信与人机交互相关的输入和输出设备。HID协议定义了HID设备和
主机之间的通信规范,确保设备能够正确地与计算机进行交互。以下是对USB HID协议的详细说明,以及其在实际应用中的一些重要方面。
USBHID协议具有简单、通用和可扩展的特点。它适用于各种输入和
输出设备,如键盘、鼠标、游戏手柄、触摸屏、数字笔等。通过HID协议,这些设备可以将用户的输入信息传输给计算机,并接收来自计算机的控制
信号和反馈信息。
HID协议使用报告(Report)的概念来进行数据交换。报告是一组有
序的数据项,用于描述设备的状态和事件。设备根据特定的报告描述(Report Descriptor)来构建和解析报告。报告描述包含报告的结构、
大小、类型和含义等信息。
HID设备通过发送报告给主机,以将用户输入传输到计算机。主机在
接收到报告后,可以根据报告的内容来进行相应的处理,例如模拟按键、
鼠标移动,或者执行其他自定义操作。主机也可以向设备发送报告,以控
制设备的行为,例如改变设备的灯光状态、调节设备的参数等。
HID协议支持两种类型的报告:输入报告和输出报告。输入报告描述
了设备的状态和事件,例如按键按下、鼠标移动等。设备通过发送输入报
告来向主机提供这些信息。输出报告用于设备接收主机的控制信号,例如
要求设备执行其中一种操作、改变设备状态等。
HID协议还支持特殊的传输方式,如中断传输和控制传输。中断传输
用于快速地、实时地传输报告。设备可以配置为定期地发送报告,以实现
usb hid原理
usb hid原理
USB HID原理
USB HID(Human Interface Device)是一种用于计算机与外部设备之间交互的通信协议。它定义了计算机与各种输入设备(如键盘、鼠标、游戏控制器等)之间的通信方式,使得这些设备可以直接与计算机进行数据交换。
USB HID的工作原理是通过在设备和主机之间建立一种标准化的通信协议,实现设备与计算机的数据传输。在USB HID协议中,设备被定义为一个或多个功能,每个功能包含一个或多个控制点。这些控制点可以是输入(Input)、输出(Output)或特性(Feature)。
在USB HID的通信过程中,设备通过发送报告(Report)与计算机进行数据交换。报告是设备与主机之间传输数据的基本单位,它可以包含多个字段,每个字段都有自己的含义和长度。设备会定期向计算机发送报告,或者在某些事件触发时主动发送报告,计算机则根据报告中的数据进行相应的处理。
USB HID的通信流程如下:首先,计算机会向设备发送一个获取报告的请求,设备收到请求后会根据自身的功能和状态来生成一个报告,并将报告发送回计算机。然后,计算机会根据报告中的数据进行相应的处理,例如更新屏幕上的图像、执行特定的操作等。设备还可以根据需要发送其他类型的报告,例如输出报告用于控制设备
的状态。
USB HID的优势在于其简单、通用和易于使用。通过使用USB HID 协议,不同类型的输入设备可以通过同一种协议与计算机进行通信,而无需为每种设备都设计独立的驱动程序。这使得设备的开发和兼容性更加方便,同时也减少了对计算机系统资源的占用。
usb hid协议
usb hid协议
USB HID协议。
USB HID(Human Interface Device)协议是一种用于连接计算机和外部设备的
通信协议,它使得外部设备(如键盘、鼠标、游戏手柄等)可以与计算机进行数据交换。USB HID协议的设计初衷是为了简化外部设备与计算机之间的通信,使得
用户可以方便地使用各种外设设备,而无需安装繁琐的驱动程序。
在USB HID协议中,每个外部设备都有一个唯一的设备地址,通过这个地址,计算机可以识别并与设备进行通信。同时,USB HID协议还规定了一系列的数据
传输格式和通信规范,确保外部设备与计算机之间的数据交换能够顺利进行。
USB HID协议的数据传输主要分为输入和输出两种方式。在输入数据传输中,外部设备将用户的操作信息(如按键、鼠标移动等)发送给计算机,而在输出数据传输中,计算机则向外部设备发送指令或数据。通过这种方式,外部设备可以与计算机进行双向的数据交换,实现各种功能和操作。
除了数据传输格式和通信规范,USB HID协议还规定了设备描述符和报告描述符等内容。设备描述符用于描述外部设备的基本信息,如设备类型、厂商信息、设备版本等,而报告描述符则用于描述外部设备的数据格式和通信协议,确保计算机可以正确地解析和处理外部设备发送的数据。
在实际应用中,USB HID协议被广泛应用于各种外部设备,如键盘、鼠标、游戏手柄、摄像头等。通过USB HID协议,这些外部设备可以方便地与计算机进行
通信,为用户提供更加便捷和高效的操作体验。
总的来说,USB HID协议作为一种通用的外部设备通信协议,为用户提供了便捷的外设设备使用体验,同时也为外部设备的设计和开发提供了统一的标准和规范。通过遵循USB HID协议,外部设备可以更好地与计算机进行交互,为用户带来更
USB_HID_设备类协议入门
一、应用场合
USB HID类是比较大的一个类,HID类设备属于人机交互操作的设备。用于控制计算机操作的一些方面,如USB鼠标,USB键盘,USB游戏操纵杆,USB触摸板,USB轨迹球、电话拨号设备、VCR遥控等等设备。另外,使用HID设备的一个好处就是,操作系统自带了HID类的驱动程序,而用户无需去开发很麻烦的驱动程序,只要直接使用API调用即可完成通信。所以很多简单的USB设备,喜欢枚举成HID设备,这样就可以不用安装驱动而直接使用。
二、USB HID类可采用的通信管道
所有的HID设备通过USB的控制管道(默认管道,即端点0)和中断管道与主机通信。
控制管道主要用于以下3个方面:
∙接收/响应USB主机的控制请示及相关的类数据
∙在USB主机查询时传输数据(如响应Get_Report请求等)
∙接收USB主机的数据
中断管道主要用于以下两个方面:
∙USB主机接收USB设备的异步传输数据
∙USB主机发送有实时性要求的数据给USB设备
从USB主机到USB设备的中断输出数据传输是可选的,当不支持中断输出数据传输时,USB主机通过控制管道将数据传输给USB设备。
三、与USB HID设备有关的描述符
HID设备的描述符除了5个USB的标准描述符(设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符,见百合电子工作室的另一篇文章:USB开发基础--USB命令(请求)和USB描述符)外,还包括3个HID设备类特定描述符:HID描述符、报告描述符、实体描述符。
除了HID的三个特定描述符组成对HID设备的解释外,5个标准描述符中与HID设备有关的部分有:
USBHID设备类协议入门
USBHID设备类协议入门
USB HID(Human Interface Device)设备类协议是一种用于连接人
机界面设备(如键盘、鼠标、游戏控制器)到计算机的通信协议。该协议
定义了设备和主机之间的数据传输格式、命令和响应等规则,使得不同厂
商的HID设备可以在不同操作系统上正常工作。
1.键盘设备:USBHID键盘设备协议定义了键盘数据的传输格式。键
盘通过发送按键代码和状态信息告知主机用户的输入。主机则通过向键盘
发送命令来控制LED指示灯的状态。
2.鼠标设备:USBHID鼠标设备协议定义了鼠标数据的传输格式。鼠
标传输的数据包括鼠标移动、按键和滚轮信息等。主机通过解析这些数据
来控制光标的移动和与鼠标相关的操作。
3.游戏控制器:USBHID游戏控制器设备协议支持各种类型的游戏控
制器,如游戏手柄、方向盘和航空杆等。该协议规定了游戏控制器的按键、摇杆和轴等输入数据的格式和传输方式。
4.触摸屏设备:USBHID触摸屏设备协议定义了触摸屏的输入数据格式。触摸屏通过发送坐标和触摸状态信息来告知主机用户的触摸操作。
在USB HID设备类协议中,设备和主机之间的通信基于报告描述器(Report Descriptor)。报告描述器定义了设备的输入和输出报告格式。设备将报告描述器发送到主机,以便主机能够正确解析设备发送的数据。
总结来说,USBHID设备类协议是用于连接各种人机界面设备到计算
机的协议。它定义了设备和主机之间的通信规则和数据格式,以确保不同
类型的设备在不同的操作系统上能够正常工作。通过了解和遵守USBHID
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Windows主机端与自定义USB HID设备通信详解 (2009-06-12 23:19)
分类:Windows
说明:
-以下结论都是基于Windows XP系统所得出的,不保证在其他系统的适用性。-在此讨论的是HID自定义设备,对于标准设备,譬如USB鼠标和键盘,由于操作系统对其独占,许多操作未必能正确执行。
1.所使用的典型Windows API
CreateFile
ReadFile
WriteFile
以下函数是DDK的内容:
HidD_SetFeature
HidD_GetFeature
HidD_SetOutputReport
HidD_GetInputReport
其中,CreateFile用于打开设备;ReadFile、HidD_GetFeature、
HidD_GetInputReport用于设备到主机方向的数据通信;WriteFile、
HidD_SetFeature、HidD_SetOutputReport用于主机到设备方向的数据通信。鉴于实际应用,后文主要讨论CreateFile,WriteFile,ReadFile,HidD_SetFeature四个函数,明白了这四个函数,其它的可以类推之。
2.几个常见错误
当使用以上API时,如果操作失败,调用GetLastError()会得到以下常见错误:
6:句柄无效
23:数据错误(循环冗余码检查)
87:参数错误
1784:用户提供的buffer无效
后文将会详细说明这些错误情况。
3.主机端设备枚举程序流程
4.函数使用说明
CreateFile(devDetail->DevicePath, //设备路径
GENERIC_READ | GENERIC_WRITE, //访问方式
FILE_SHARE_READ | FILE_SHARE_WRITE, //共享模式
NULL,
OPEN_EXISTING, //文件不存在时,返回失败
FILE_FLAG_OVERLAPPED, //以重叠(异步)模式打开
NULL);
在这里,CreateFile用于打开HID设备,其中设备路径通过函数
SetupDiGetInterfaceDeviceDetail取得。CreateFile有以下几点需要注意:- 访问方式:如果是系统独占设备,例如鼠标、键盘等等,应将此参数设置为0,否则后续函数操作将失败(譬如HidD_GetAttributes);也就是说,不能对独占设备进行除了查询以外的任何操作,所以能够使用的函数也是很有限的,下文的一些函数并不一定适合这些设备。在此顺便列出MSDN
上关于此参数的说明:
If this parameter is zero, the application can query file and
device attributes without accessing the device. This is
useful if an application wants to determine the size of a
floppy disk drive and the formats it supports without
requiring a floppy in the drive. It can also be used to test for
the file's or directory's existence without opening it for read
or write access。
-重叠(异步)模式:此参数并不会在此处表现出明显的意义,它主要是对后续的WriteFile,ReadFile有影响。如果这里设置为重叠(异步)模式,那么在使用WriteFile,ReadFile时也应该使用重叠(异步)模式,反之亦然。这首先要求WriteFile,ReadFile的最后一个参数不能为空
(NULL)。否则,便会返回87(参数错误)错误号。当然,87号错误并不代表就是此参数不正确,更多的信息将在具体讲述这两个函数时指出。此参数为0时,代表同步模式,即WriteFile,ReadFile操作会在数据处理完成之后才返回,否则阻塞在函数内部。
ReadFile(hDev, //设备句柄,即CreateFile的返回值recvBuffer, //用于接收数据的buffer
IN_REPORT_LEN, //要读取数据的长度
&recvBytes, //实际收到的数据的字节数
&ol); //异步模式
在这里,ReadFile用于读取HID设备通过中断IN传输发来的输入报告。有以下几点要注意:
1、ReadFile的调用不会引起设备的任何反应,即HID设备与主机之间的中断IN传输不与ReadFile打交道。实际上主机会在最大间隔时间(由设备的端点描述符来指定)内轮询设备,发出中断IN传输的请求。“读取”即意味着从某个buffer里面取回数据,实际上这个buffer就是HID设备驱动中的buffer。这个buffer的大小可以通过HidD_SetNumInputBuffers来改变。在XP上缺省值是32(个报告)。
2、读取的数据对象是输入报告,也即通过中断输入管道传入的数据。所以,如果设备不支持中断IN传输,那么是无法使用此函数来得到预期结果的。实际上这种情况不可能在HID中出现,因为协议指明了至少要有一个中断IN端点。
3、IN_REPORT_LEN代表要读取的数据的长度(实际的数据正文+一个byte 的报告ID),这里是一个常数,主要是因为设备固件的信息我是完全知道的,当然知道要读取多少数据(也就是报告的长度);不过也可以通过另外的函数(HidD_GetPreparsedData)来事先取得报告的长度,这里不做详细讨论。因为很难想象在不了解固件信息的情况下来做自定义设备的HID通信,在实际应用中一般来说就是固件与PC程序匹配着来开发。此参数如果设置过大,