阅读:2016回复:5
pdiusbd12:上位机pc端接收函数模块不返回结果?
我的硬件环境是这样的:当PC端向d12的某一端点接收缓冲区发数据的时候,d12立即产生中断,固件的中断处理例程将接收区数据转移到该端点的发送缓冲区。上位机读写d12的WriteFile/ReadFile为异步操作模式,我的接收功能模块代码如下:
ResetEvent(ovRead.hEvent); if (!ReadFile(m_hDev,pDat,nBlockSize,NULL,lpOverlapped)) { if (GetLastError() == ERROR_IO_PENDING) { dwRead = 0; while (!GetOverlappedResult(m_hDev,lpOverlapped,&dwRead,FALSE)) { if(GetLastError() == ERROR_IO_INCOMPLETE) { Sleep(5); } } nReadBytes += dwRead; pDat += dwRead; } else { wsprintf(szError,"Error:%d\n",GetLastError()); OutputDebugString(szError); return ERR_USB_REQUEST; } } 指定nBlockSize为64的倍数。在实际调用该模块时,需要将接收数据或接收字节数返回给调用者便于编程。我的问题是:当d12接收区无数据时或数据不足nBlockSize所指的字节大小,并不能跳出while循环。这样就不能立即返回读取的字节数。发现只有d12接收区字节数达到nBlockSize时才跳出循环并返回。大家有没有清楚是什么原因的,或者还有其他的好的方法返回字节数或缓冲区内容,帮帮忙! |
|
沙发#
发布于:2009-08-13 11:02
我在使用ReadFile(hDev,pData,256,lpOverlapped)时,当待接收的数据大小<64或>64时,调用可以返回;
但是当待接收数据等于64时,调用不返回,一直阻塞在那里;不知道什么原因?请DX们帮忙 |
|
板凳#
发布于:2009-08-13 17:47
自己顶。。
|
|
地板#
发布于:2009-08-17 14:46
用户被禁言,该主题自动屏蔽! |
|
地下室#
发布于:2009-08-17 15:43
回 3楼(gutian98) 的帖子
我调试时发现了一个问题:当指定异步读操作ReadFile要读的字节数nBlockSize为256,当接收到的数据字节数为64的但不是256的倍数时,不能跳出while;其他情况下,只要接收到的数据字节数dwRead值不为64的倍数,可以跳出while,比如64,128,192,320等等就不跳出循环,而其它的反而跳出了while… |
|
5楼#
发布于:2009-08-19 12:19
D12 ReadFile,该如何判断I/O操作是否完成呢?期待解答
|
|