! " #$$%& '(#
)$ *& &$$ + )$ ,-
& &##$ !
.'/) &&
%&+.' ) ,$#* &
(# 0 $'0 1 $ & +
$$ 。
- 重叠(异步)模式:此参数并不会在此处表现出明显的意义,它主要
是对后续的 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 程序匹配着来开发。此参数如