readfile读取usb HID设备延续多次写入读出后读不出来数据
readfile读取usb HID设备连续多次写入读出后读不出来数据
刚解决了写不进去数据的问题,现在发现连续往此HID设备里写入读出若干条数据后,用readfile读出的数据是上一条指令的,buff每次都清空的,或者执行好几次rwitefile、readfile才能返回当前指令应该返回的数据。关键代码如下:
这是为什么呢?大家帮忙找找原因。
------解决思路----------------------
你的两个事件对象 hEventObject; 怎么不初始化?
------解决思路----------------------
我的程序与你最大的不同是:
1、读、写分开并由不同的事件进行驱动。
2、一但操作启动,所有的动作和操作均由当前的状态决定,这些状态来自读、写事件,定时器,手动操作,系统消息等。
------解决思路----------------------
读写没必要用不同的HANDLE
WriteFile 调试看是否每次都发送成功了
不要一次发多个数据, HID缓冲可能会被冲掉
刚解决了写不进去数据的问题,现在发现连续往此HID设备里写入读出若干条数据后,用readfile读出的数据是上一条指令的,buff每次都清空的,或者执行好几次rwitefile、readfile才能返回当前指令应该返回的数据。关键代码如下:
WriteHandle=CreateFile
(detailData->DevicePath,
GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
ReadHandle=CreateFile
(detailData->DevicePath,
GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE,
(LPSECURITY_ATTRIBUTES)NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
//写数据
HANDLE hEventObject;
if (hEventObject == 0)
{
hEventObject = CreateEvent
(NULL,
TRUE,
TRUE,
"");
DisplayLastError("CreateEvent: ") ;
//Set the members of the overlapped structure.
HIDOverlapped.hEvent = hEventObject;
HIDOverlapped.Offset = 0;
HIDOverlapped.OffsetHigh = 0;
}
if (WriteHandle != INVALID_HANDLE_VALUE)
{
Result = WriteFile
(WriteHandle,
OutputReport,
Capabilities.OutputReportByteLength,
&BytesWritten,
(LPOVERLAPPED) &HIDOverlapped
//0
);
}
/*Result = */WaitForSingleObject(hEventObject, 2000);
ResetEvent(hEventObject);
//读数据
HANDLE hEventObject1;
if (hEventObject1 == 0)
{
hEventObject1 = CreateEvent
(NULL,
TRUE,
FALSE,
NULL);
DisplayLastError("CreateEvent: ") ;
//Set the members of the overlapped structure.
HIDOverlapped.hEvent = hEventObject1;
HIDOverlapped.Offset = 0;
HIDOverlapped.OffsetHigh = 0;
}
if (ReadHandle != INVALID_HANDLE_VALUE)
{
Result = ReadFile
(ReadHandle,
InputReport,
Capabilities.InputReportByteLength,
&NumberOfBytesRead,
(LPOVERLAPPED) &HIDOverlapped);
}
Result = WaitForSingleObject(hEventObject1, 6000);
switch (Result)
{
case WAIT_OBJECT_0:
{
break;
}
case WAIT_TIMEOUT:
{
Result = CancelIo(ReadHandle);
break;
}
default:
{
break;
}
}
ResetEvent(hEventObject);
这是为什么呢?大家帮忙找找原因。
------解决思路----------------------
你的两个事件对象 hEventObject; 怎么不初始化?
------解决思路----------------------
我的程序与你最大的不同是:
1、读、写分开并由不同的事件进行驱动。
2、一但操作启动,所有的动作和操作均由当前的状态决定,这些状态来自读、写事件,定时器,手动操作,系统消息等。
------解决思路----------------------
读写没必要用不同的HANDLE
WriteFile 调试看是否每次都发送成功了
不要一次发多个数据, HID缓冲可能会被冲掉