sanone28
驱动牛犊
驱动牛犊
  • 注册日期2009-06-05
  • 最后登录2010-01-18
  • 粉丝1
  • 关注0
  • 积分20分
  • 威望181点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1951回复:5

pdiusbd12:上位机pc端接收函数模块不返回结果?

楼主#
更多 发布于:2009-08-12 16:28
我的硬件环境是这样的:当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时才跳出循环并返回。大家有没有清楚是什么原因的,或者还有其他的好的方法返回字节数或缓冲区内容,帮帮忙!
sanone28
驱动牛犊
驱动牛犊
  • 注册日期2009-06-05
  • 最后登录2010-01-18
  • 粉丝1
  • 关注0
  • 积分20分
  • 威望181点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-08-13 11:02
我在使用ReadFile(hDev,pData,256,lpOverlapped)时,当待接收的数据大小<64或>64时,调用可以返回;
但是当待接收数据等于64时,调用不返回,一直阻塞在那里;不知道什么原因?请DX们帮忙
sanone28
驱动牛犊
驱动牛犊
  • 注册日期2009-06-05
  • 最后登录2010-01-18
  • 粉丝1
  • 关注0
  • 积分20分
  • 威望181点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-08-13 17:47
自己顶。。
gutian98
禁止发言
禁止发言
  • 注册日期2003-01-12
  • 最后登录2016-12-11
  • 粉丝4
  • 关注2
  • 积分760分
  • 威望8026点
  • 贡献值1点
  • 好评度364点
  • 原创分0分
  • 专家分21分
  • 金点子奖
  • 社区居民
地板#
发布于:2009-08-17 14:46
用户被禁言,该主题自动屏蔽!
sanone28
驱动牛犊
驱动牛犊
  • 注册日期2009-06-05
  • 最后登录2010-01-18
  • 粉丝1
  • 关注0
  • 积分20分
  • 威望181点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-08-17 15:43
回 3楼(gutian98) 的帖子
我调试时发现了一个问题:当指定异步读操作ReadFile要读的字节数nBlockSize为256,当接收到的数据字节数为64的但不是256的倍数时,不能跳出while;其他情况下,只要接收到的数据字节数dwRead值不为64的倍数,可以跳出while,比如64,128,192,320等等就不跳出循环,而其它的反而跳出了while…
sanone28
驱动牛犊
驱动牛犊
  • 注册日期2009-06-05
  • 最后登录2010-01-18
  • 粉丝1
  • 关注0
  • 积分20分
  • 威望181点
  • 贡献值1点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2009-08-19 12:19
D12 ReadFile,该如何判断I/O操作是否完成呢?期待解答
游客

返回顶部