首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

USB WriteFile有关问题

2012-01-14 
USB WriteFile问题我在使用USB WriteFile时,开始不出错,但写着写着就会出现ERROR_IO_PENDING请问题是什么

USB WriteFile问题
我在使用USB WriteFile时,开始不出错,但写着写着就会出现ERROR_IO_PENDING
请问题是什么问题呢
我在同时在跑一个进程,他会对USB进行ReadFile!!

ReadFile进程 Code
if(MyDevFound==TRUE)
{
if(hReadHandle==INVALID_HANDLE_VALUE) //如果读句柄无效
{
pAppDlg->AddToInfOut("无效的读报告句柄,可能是打开设备时失败");
}
else //否则,句柄有效
{
//则调用ReadFile函数请求9字节的报告数据
ReadFile(hReadHandle,
ReadReportBuffer,
9,
NULL,
&ReadOverlapped);
}

//等待事件触发
WaitForSingleObject(ReadOverlapped.hEvent,INFINITE);

//如果等待过程中设备被拔出,也会导致事件触发,但此时MyDevFound
//被设置为假,因此在这里判断MyDevFound为假的话就进入下一轮循环。
if(MyDevFound==FALSE) continue;

//如果设备没有被拔下,则是ReadFile函数正常操作完成。
//通过GetOverlappedResult函数来获取实际读取到的字节数。
GetOverlappedResult(hReadHandle,&ReadOverlapped,&Length,TRUE);

//如果字节数不为0,则将读到的数据显示到信息框中
if(Length!=0)
{
pAppDlg->AddToInfOut("读取报告"+pAppDlg->itos(Length)+"字节");
Str="";
for(i=0;i<Length;i++)
{
Str+=pAppDlg->itos(ReadReportBuffer[i],16).Right(2)+" ";
}
pAppDlg->AddToInfOut(Str, FALSE);
}

//如果字节数为9,则说明获取到了正确的9字节报告
if(Length==9)
{
//第一字节为报告ID,应该为0
if(ReadReportBuffer[0]==0)
{
//第二字节为按键状态,将其保存到KeyStatus中。
g_u8KeyFlag=ReadReportBuffer[1];
if(g_u8KeyFlag&KEY_FLAG)
{
//Add 按键处理
if(ReadReportBuffer[2]&KEY_REPEAT)
{
//Repeat Key Process
//KeyStatus=ReadReportBuffer[2];
KeyStatus=~ReadReportBuffer[2];
KeyStatus&=0x1f;
}
else
{
KeyStatus=~ReadReportBuffer[2];
KeyStatus&=0x1f;
}

}
if(g_u8KeyFlag&BIAOFLAG)
{
//Add 标靶处理函数

}
if(ZHENDONG&g_u8KeyFlag)
{

}
if(COIN_FLAG&g_u8KeyFlag)
{

}
}
}
}
else
{
//阻塞线程,直到下次事件被触发
WaitForSingleObject(ReadOverlapped.hEvent,INFINITE);
}

Write File是在自己需要的时候再写

[解决办法]
ERROR_IO_PENDING 这个消息是你这个IRP消息在内核挂起了,并没有完成!
[解决办法]
ReadFile 异步操作,ReadFile内部并不会创建事件,而是由最后一个参数提供所需事件! 在内核中,因为异步,所以用来设置事件为激发态的IoCompleteRequest函数并没有被调用! 因此该IRP请求没有被结束. 但ReadFile会立刻返回,返回值就为 ERROR_IO_PENDING. 这只是表示该IRP没有被真正的完成,ReadFile只是异步的返回. 当内核中该IRP请求被真正的结束时,会调用IoCompleteRequest,ReadFile函数提供的事件才会被设置,这是就表示真正的完成了! 

所谓的挂起是内核暂时将该IRP请求挂起,在内核中完成了会自行设置! 所以应用层无需考虑 ERROR_IO_PENDING这个错误,实际上这不是错误! 

热点排行