readfile读取usb HID设备连续多次写入读出后读不出来数据

beiyiwangdeshen 2014-11-04 06:22:51
刚解决了写不进去数据的问题,现在发现连续往此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);


这是为什么呢?大家帮忙找找原因。
...全文
483 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
beiyiwangdeshen 2014-11-06
  • 打赏
  • 举报
回复
引用 3 楼 zzz3265 的回复:
读写没必要用不同的HANDLE WriteFile 调试看是否每次都发送成功了 不要一次发多个数据, HID缓冲可能会被冲掉
1. HANDLE相不相同应该不影响吧 2. writefile我调试过几次,返回值是1,说明是成功的,可接收数据还是上条指令的 3. 不要一次发多个数据啥意思?发送缓冲和接收缓冲我都定义的是大小64的char数组,因为厂家说了最多64字节数据, 每次都是先清空读写缓冲再只填充写缓冲,再整个放入writefile、readfile作为参数,应该不存在发送多个数据吧
beiyiwangdeshen 2014-11-06
  • 打赏
  • 举报
回复
引用 2 楼 wxhxj0268 的回复:
我的程序与你最大的不同是: 1、读、写分开并由不同的事件进行驱动。 2、一但操作启动,所有的动作和操作均由当前的状态决定,这些状态来自读、写事件,定时器,手动操作,系统消息等。
我这里就是读和写分开的嘛,定义的不同的handle,网上查的资料都是这样写的,只不过我这里只写了关键代码,用的时候肯定要分不同的消息去分别响应不同事件
beiyiwangdeshen 2014-11-06
  • 打赏
  • 举报
回复
引用 1 楼 Henzox 的回复:
你的两个事件对象 hEventObject; 怎么不初始化?
hEventObject每次用的时候其实都是作为局部变量重新create的,这里我改成作为局部变量 定义的时候直接创建,也相当于赋初值了,也不行
Yofoo 2014-11-05
  • 打赏
  • 举报
回复
读写没必要用不同的HANDLE WriteFile 调试看是否每次都发送成功了 不要一次发多个数据, HID缓冲可能会被冲掉
笨笨仔 2014-11-04
  • 打赏
  • 举报
回复
我的程序与你最大的不同是: 1、读、写分开并由不同的事件进行驱动。 2、一但操作启动,所有的动作和操作均由当前的状态决定,这些状态来自读、写事件,定时器,手动操作,系统消息等。
Henzox 2014-11-04
  • 打赏
  • 举报
回复
你的两个事件对象 hEventObject; 怎么不初始化?

2,641

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧