有这样一个控制HID设备的函数HidD_FlushQueue定义如下:
HidD_FlushQueue(
IN HANDLE HidDeviceObject
)
{
DWORD ret; return DeviceIoControl(
HidDeviceObject,
IOCTL_HID_FLUSHQUEUE,
NULL,
0,
NULL,
0,
&ret,
NULL);
} 其中#define IOCTL_HID_FLUSHQUEUE CTL_CODE(FILE_DEVICE_HID, 0x65, METHOD_NEITHER, FILE_ANY_ACCESS) 请问这个DeviceIoControl实现什么功能,请高手指教!谢谢!!
HidD_FlushQueue(
IN HANDLE HidDeviceObject
)
{
DWORD ret; return DeviceIoControl(
HidDeviceObject,
IOCTL_HID_FLUSHQUEUE,
NULL,
0,
NULL,
0,
&ret,
NULL);
} 其中#define IOCTL_HID_FLUSHQUEUE CTL_CODE(FILE_DEVICE_HID, 0x65, METHOD_NEITHER, FILE_ANY_ACCESS) 请问这个DeviceIoControl实现什么功能,请高手指教!谢谢!!
对设备进行操作
个人见解欢迎拍砖
比如说,某个键盘设备它是这样处理的:
case IOCTL_GET_SYS_BUTTON_CAPS:
case IOCTL_HID_FLUSH_QUEUE:
case IOCTL_HID_SET_FEATURE:
case IOCTL_HID_GET_FEATURE:
case IOCTL_GET_PHYSICAL_DESCRIPTOR:
case IOCTL_HID_GET_HARDWARE_ID:
case IOCTL_HID_GET_MANUFACTURER_STRING:
case IOCTL_HID_GET_PRODUCT_STRING:
case IOCTL_HID_GET_SERIALNUMBER_STRING:
case IOCTL_HID_GET_INDEXED_STRING:
if (deviceExtension->PnP && (deviceExtension != Globals.GrandMaster)) {
IoSkipCurrentIrpStackLocation (Irp);
status = IoCallDriver (deviceExtension->TopPort, Irp);
break;
}
实现HID设备与PC的双向通信。目前设备已识别,而且可以正常通信。读写数据的代码如下:
memcpy(&wBuffer[1], m_writebuff, min(32, m_writebuff.GetLength()));
if(WriteFile(hidHandle, wBuffer, 33, &dwRet,NULL))
{
//写成功 Sleep(2000);
if(ReadFile(hidHandle, rBuffer, 33, &dwRet, NULL))
{
//读成功
memcpy(str, &rBuffer[1], min(32, strlen((char *)&rBuffer[1])));
m_readbuff=str;
UpdateData(false);
}
else
MessageBox("读失败!"); MessageBox("读写成功!"); }
else
MessageBox("写失败!"); 但是必须得有Sleep(2000);一句,否则读出的数据就是“旧值”,需要读好几次才能读到“新值”。也就是说先用WriteFile写数据,马上用ReadFile读数据是不行的,需要延迟。而且我已测明不是hid设备慢,因为使用一个软件读写该设备可以实现“即写即读”。一位高手建议在WriteFile后面调用函数HidD_FlushQueue,结果果然奏效,但是不知其所以然,在这里刷新handle的buffer有什么用,其实现机理是什么?核心问题集中在函数HidD_FlushQueue的作用,为什么刷新数据队列后即可以实现hid 设备读写的同步。谢谢!!!!!
正好相反,是从设备读数据(ReadFile读取HID设备),这个过程又是怎样呢?谢谢
您说的收集数据一段时间是不是指的 向设备写数据时在缓冲区收集一段时间,不直接写到设备上,我说的
正好相反,是从设备读数据(ReadFile读取HID设备),这个过程又是怎样呢?谢谢
#12说的也是Write"有人讲"那个是对的。要么是PC轮询,那么是自己Flush去强制PC将USB设备读到缓冲区,然后去ReadFile。
轮询其实是在IRP_MJ_READ里面一个写IRP的Buffer的过程,驱动里面“Sleep”一会再写那个缓冲区当然,驱动里面Sleep不是通过Sleep函数。
现在是:
WriteFile(……)//写数据到hid—usb
ReadFile(……)//读数据
读出来的就是老值;但是
WriteFile(……)//写数据到hid—usb
Sleep(2000)
ReadFile(……)//读数据or
WriteFile(……)//写数据到hid—usb
HidD_FlushQueue
ReadFile(……) //读数据就实现了“即读即写”的功能。HidD_FlushQueue之类的函数都是hid.dll中定义的,其实现无非是调用API函数DeviceIoControl来调用驱动例程。我所不明白的是为什么Sleep(2000)或HidD_FlushQueue之后就可以读到新值,否则就读到旧值。我不了解WriteFile和ReadFile的实现过程。现在要写一个报告把其原因说明一下,所以比较急。所以发了这么多帖,真诚希望得到高手的帮助。
Sleep Sleep
将内容放到IRP的Buffer ReadFile明白!!!????