Windows主机端与自定义USB_HID设备通信详解
USB的HID通信协议

USB的HID通信协议USB HID(Human Interface Device)通信协议是一种用于实现USB设备与计算机之间人机交互的通信标准。
它定义了如何将输入和输出的信息在USB总线上进行传输并进行解释。
在该协议中,设备被称为USB HID设备,计算机被称为主机。
以下是USB HID通信协议的详细介绍。
1.通信协议层次结构USBHID通信协议定义了四个层次的模型。
最底层是物理层,负责USB总线的电气特性和通信速率。
上一层是USB传输层,负责数据包传输的同步和差错检测。
再上一层是USB配置层,负责设备枚举和配置。
最顶层是HID层,负责定义设备的输入输出报告格式和解析。
2.报告描述符HID通信协议通过报告描述符定义设备的输入和输出报告格式。
输入报告描述设备向主机传输输入数据,输出报告描述主机向设备传输输出数据。
报告描述符包含了报告ID、报告大小和报告类型等信息,主机通过解析报告描述符来理解设备传输的数据。
3.报告传输设备通过中断传输和控制传输与主机进行通信。
中断传输是指设备周期性地传输输入报告给主机,主机可以根据需要设置中断传输的频率。
控制传输是指主机向设备发送控制命令或获取设备属性信息。
4.事件推送和轮询设备可以通过事件推送和轮询两种方式向主机传输数据。
事件推送是指设备主动向主机发送输入报告。
轮询是指主机定期向设备发送轮询请求,设备在收到请求后返回输入报告。
事件推送和轮询可以结合使用,以满足不同的应用需求。
5.输入报告解析主机通过解析输入报告来获取设备传输的数据。
输入报告由报告ID和报告数据组成。
主机可以根据报告描述符的信息来解析报告数据,获取具体的输入信息。
解析后的数据可以用于触发软件事件或更新设备状态。
6.输出报告处理主机通过发送输出报告向设备传输数据。
输出报告也由报告ID和报告数据组成。
设备可以根据报告描述符的信息解析报告数据,并根据需要进行相应的处理。
7.随机访问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设备有关的部分有:•设备描述符中bDeviceClass、bDeviceSubClass和bDeviceProtocol 三个字段的值必须为零。
•接口描述符中bInterfaceClass的值必须为0x03,bInterfaceSubClass的值为0或1,为1表示HID设备符是一个启动设备(Boot Device,一般对PC机而言才有意义,意思是BIOS启动时能识别并使用您的HID设备,且只有标准鼠标或键盘类设备才能成为Boot Device。
Windows主机端与自定义USB-HID设备通信详解

Windows主机端与自定义USB HID设备通信详解说明:-以下结论都是基于Windows XP 系统所得出的,不保证在其他系统的适用性。
-在此讨论的是HID 自定义设备,对于标准设备,譬如USB 鼠标和键盘,由于操作系统对其独占,许多操作未必能正确执行。
1.所使用的典型Windows APICreateFileReadFileWriteFile以下函数是DDK 的内容:HidD_SetFeatureHidD_GetFeatureHidD_SetOutputReportHidD_GetInputReport其中,CreateFile 用于打开设备;ReadFile 、HidD_GetFeature 、HidD_GetInpu tReport 用于设备到主机方向的数据通信;WriteFile 、HidD_SetFeature 、HidD_Set OutputReport 用于主机到设备方向的数据通信。
鉴于实际应用,后文主要讨论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 设备,其中设备路径通过函数SetupDiGetInterfac eDeviceDetail 取得。
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:当输入输出数据不足以满足需求时。
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 hid原理

windows hid原理
Windows HID(Human Interface Device)原理涉及操作系统与输入设备之间的交互。
HID是一种通用的设备类别,包括键盘、鼠标、游戏手柄等。
Windows操作系统通过HID协议与这些设备进行通信。
在Windows中,HID设备通过设备驱动程序与操作系统进行通信。
当用户操作键盘或鼠标时,设备会生成相应的信号,通过USB 或蓝牙等接口传输到计算机。
操作系统的HID驱动程序会接收这些信号,并将其转换成操作系统能够理解的输入数据。
HID设备发送的数据通常是一系列的报文,其中包含了设备类型、按键状态、鼠标移动信息等。
Windows操作系统的HID驱动程序会解析这些报文,然后将其转换成对应的输入事件,比如键盘按键按下、鼠标移动等。
一旦操作系统接收到这些输入事件,它会将其传递给相应的应用程序或者系统组件进行处理。
比如,键盘输入会传递给当前获得焦点的应用程序,鼠标移动则会影响鼠标指针在屏幕上的位置等。
总的来说,Windows HID原理涉及操作系统通过HID驱动程序与输入设备进行通信,将设备发送的数据转换成操作系统能够理解的输入事件,最终传递给应用程序或系统组件进行处理。
这种交互过程保证了用户能够通过各种HID设备与计算机进行交互操作。
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协议规定的规则和格式发送数据到计算机,计算机则负责解析这些数据并执行相应的操作。
5.HID通信协议的扩展功能:HID通信协议除了定义了基本的数据传输、数据解释和通信流程外,还提供了一些扩展功能来支持设备的特殊需求。
这些扩展功能包括通信协议的可配置性、事件通知机制、设备状态的上报以及多设备的管理等。
总结:USB的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设备需要提供一个报告描述符,用于描述设备支持的报告类型和报告格式。
报告描述符通常以二进制格式存储在设备的固件中,并在设备插入时由操作系统读取。
3.报告传输:HID设备和HID主机之间的报告传输通常使用USB接口进行。
HID设备通过USB接口将报告发送给HID主机,而HID主机则通过USB接口向HID设备发送请求并接收报告。
4.数据处理:HID主机接收到报告后,需要对报告进行解析和处理,以获取其中的输入数据。
操作系统提供了HID API供开发者使用,开发者可以使用这些API来访问和处理HID设备的输入信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Windows主机端与自定义USB HID设备通信详解说明:-以下结论都是基于 Windows XP 系统所得出的,不保证在其他系统的适用性。
-在此讨论的是 HID 自定义设备,对于标准设备,譬如 USB 鼠标和键盘,由于操作系统对其独占,许多操作未必能正确执行。
1.所使用的典型Windows APICreateFileReadFileWriteFile以下函数是 DDK 的内容:HidD_SetFeatureHidD_GetFeatureHidD_SetOutputReportHidD_GetInputReport其中, CreateFile 用于打开设备; ReadFile 、 HidD_GetFeature 、 HidD_GetInputRep ort 用于设备到主机方向的数据通信; WriteFile 、HidD_SetFeature 、 HidD_SetOutput Report 用于主机到设备方向的数据通信。
鉴于实际应用,后文主要讨论 CreateFile , Write File , 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 设备,其中设备路径通过函数 SetupDiGetInterfaceDe viceDetail 取得。
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 determin e 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 ex istence without opening it for read or write access。
-重叠(异步)模式:此参数并不会在此处表现出明显的意义,它主要是对后续的 WriteFil e , ReadFile 有影响。
如果这里设置为重叠(异步)模式,那么在使用 WriteFile , ReadFi le 时也应该使用重叠(异步)模式,反之亦然。
这首先要求 WriteFile , ReadFile 的最后一个参数不能为空( NULL )。
否则,便会返回 87 (参数错误)错误号。
当然, 87 号错误并不代表就是此参数不正确,更多的信息将在具体讲述这两个函数时指出。
此参数为 0 时,代表同步模式,即 WriteFile , ReadFile 操作会在数据处理完成之后才返回,否则阻塞在函数内部。
ReadFile(hDev, // 设备句柄,即 CreateFile 的返回值recvBuffer, // 用于接收数据的 bufferIN_REPORT_LEN, // 要读取数据的长度&recvBytes, // 实际收到的数据的字节数&ol); // 异步模式在这里, ReadFile 用于读取 HID 设备通过中断 IN 传输发来的输入报告。
有以下几点要注意:1 、 ReadFile 的调用不会引起设备的任何反应,即 HID 设备与主机之间的中断 IN 传输不与 R eadFile 打交道。
实际上主机会在最大间隔时间(由设备的端点描述符来指定)内轮询设备,发出中断 IN 传输的请求。
“读取”即意味着从某个 buffer 里面取回数据,实际上这个 buffer 就是 HID 设备驱动中的 buffer 。
这个 buffer 的大小可以通过 HidD_SetNumInputBuffers 来改变。
在 XP 上缺省值是 32 (个报告)。
2 、读取的数据对象是输入报告,也即通过中断输入管道传入的数据。
所以,如果设备不支持中断 IN 传输,那么是无法使用此函数来得到预期结果的。
实际上这种情况不可能在 HID 中出现,因为协议指明了至少要有一个中断 IN 端点。
3 、 IN_REPORT_LEN 代表要读取的数据的长度(实际的数据正文 + 一个 byte 的报告 ID ),这里是一个常数,主要是因为设备固件的信息我是完全知道的,当然知道要读取多少数据(也就是报告的长度);不过也可以通过另外的函数(HidD_GetPrepars edData)来事先取得报告的长度,这里不做详细讨论。
因为很难想象在不了解固件信息的情况下来做自定义设备的 HID 通信,在实际应用中一般来说就是固件与 PC 程序匹配着来开发。
此参数如果设置过大,不会有实质性的错误,在 recvBytes 参数中会输出实际读到的长度;如果设置过小,即小于报告的长度,会返回 1784 号错误(用户提供的 buffer 无效)。
4 、关于异步模式。
前面已经提过,此参数的设置必须与 CreateFile 时的设置相对应,否则会返回 87 号错误(参数错误)。
如果不需要异步模式,此参数需置为 NULL 。
在这种情况下, R eadFile 会一直等待直到数据读取成功,所以会阻塞住程序的当前过程。
WriteFile(hDev, // 设备句柄,即 CreateFile 的返回值reportBuf, // 存有待发送数据的 bufferOUT_REPORT_LEN, // 待发送数据的长度&sendBytes, // 实际收到的数据的字节数&ol); // 异步模式在这里, WriteFile 用于传输一个输出报告给 HID 设备。
有以下几点要注意:1、与 ReadFile 不同, WriteFile 函数被调用后,虽然也是经过驱动程序,但是最终会反映到设备中。
也就是说,调用 WriteFile 后,设备会接收到输出报告的请求。
如果设备使用了中断 OUT 传输,则 WriteFile 会通过中断 OUT 管道来进行传输;否则会使用 SetReport 请求通过控制管道来传输。
2、OUT_REPORT_LEN 代表要写入的数据长度(实际的数据正文 + 一个 byte 的报告 ID )。
如果大于实际报告的长度,则使用实际报告长度;如果小于实际报告长度,会返回 1784 号错误(用户提供的 buffer 无效)。
3、reportBuf [0] 必须存有待发送报告的 ID ,并且此报告 ID 指示的必须是输出报告,否则会返回 87 号错误(参数错误)。
这种情况可能容易被程序员忽略,结果不知错误号所反映的是什么,网上也经常有类似疑问的帖子。
顺便指出,输入报告、输入报告、特征报告这些报告类型,是反映在 HID 设备的报告描述符中。
后文将做举例讨论。
4、关于异步模式。
前面已经提过,此参数的设置必须与 CreateFile 时的设置相对应,否则会返回 87 号错误(参数错误)。
如果不需要异步模式,此参数需置为 NULL 。
在这种情况下, W riteFile 会一直等待直到数据读取成功,所以会阻塞住程序的当前过程。
HidD_SetFeature(hDev, // 设备句柄,即 CreateFile 的返回值reportBuf, // 存有待发送数据的 bufferFEATURE_REPORT_LEN); //buffer 的长度HidD_SetOutputReport(hDev, // 设备句柄,即 CreateFile 的返回值reportBuf, // 存有待发送数据的 bufferOUT_REPORT_LEN); //buffer 的长度HidD_SetFeature 发送一个特征报告给设备, HidD_ SetOutputReport 发送一个输出报告给设备。
注意以下几点:1、跟 WriteFile 类似,必须在 reportBuf [0] 中指明要发送的报告的 ID ,并且和各自适合的类型相对应。
也就是说, HidD_SetFeature 只能发送特征报告,因此报告 ID 必须是特征报告的 ID ; HidD_SetOutputReport 只能发送输出报告,因此报告 ID 只能是输出报告的 ID 。
2、这两个函数最常返回的错误代码是 23 (数据错误)。
包括但不仅限于以下情况:- 报告 ID 与固件描述的不符。
- 传入的 buffer 长度少于固件描述的报告的长度。
据有关资料反映(非官方文档),只要是驱动程序对请求无反应,都会产生此错误。
5.常见错误汇总- HID ReadFile- Error Code 6 (handle is invalid)传入的句柄无效- Error Code 87 ( 参数错误 )很可能是 createfile 时声明了异步方式,但是读取时按同步读取。
- Error Code 1784 ( 用户提供的 buffer 无效 ):传参时传入的“读取 buffer 长度”与实际的报告长度不符。
- HID WriteFile- Error Code 6 (handle is invalid)传入的句柄无效- Error Code 87 (参数错误)- CreateFile 时声明的同步 / 异步方式与实际调用 WriteFile 时传入的不同。