串口异步通信循环读取数据

mrlgy 2014-07-03 04:41:04
while(m_hComm)
{

PurgeComm(m_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
ClearCommError(m_hComm, &dwErrorFlags, &ComStat);
WaitCommEvent( m_hComm, &dwEvtMask,&m_op );
WaitForSingleObject(m_op.hEvent,INFINITE);
dwError = ReadFile(m_hComm,m_rcvbuf,40,&dwRead,&m_op);

}


第一次运行到WaitForSingleObject的时候程序阻塞等待读取数据,通过虚拟串口发送40个数据,然后ReadFile读取了40个字节,但是返回了重叠I/O操作在进行中(不知道这个属不属于程序的正常行为);进入下一次循环运行到WaitForSingleObjt程序不阻塞,返回重叠I/O操作在进行中,继续进入下次循环运行到WaitForSingleObject的才阻塞等待读取数据,读取数据之后进入下次循环WaitForSingleObject又不阻塞了,如此每次读取数据之后都要多循环一次WaitForSingleObject才阻塞,求解救
...全文
344 3 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
mrlgy 2014-07-03
  • 打赏
  • 举报
回复
while(m_hComm)
	{
	
		
		PurgeComm(m_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
		WaitCommEvent( m_hComm, &dwEvtMask,&m_op );
		dwRead = GetOverlappedResult(m_hComm,&m_op,&dwTs,TRUE);
		//WaitForSingleObject(m_op.hEvent,INFINITE);
		ClearCommError(m_hComm, &dwErrorFlags, &ComStat);
		if (ComStat.cbInQue>0)
		{
			dwResult = ReadFile(m_hComm,m_rcvbuf,40,&dwRead,&m_or);
			if (!dwResult)
			{
				if(GetLastError()==ERROR_IO_PENDING)
				{
					WaitForSingleObject(m_or.hEvent,INFINITE);
				}
			}
		}	
		
	}
把 ReadFile的m_op换成m_or后ReadFile返回成功但是下一次循环还是不阻塞。
mrlgy 2014-07-03
  • 打赏
  • 举报
回复
while(m_hComm)
	{
	
		
		PurgeComm(m_hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
		WaitCommEvent( m_hComm, &dwEvtMask,&m_op );
		GetOverlappedResult(m_hComm,&m_op,&dwTs,TRUE);
		//WaitForSingleObject(m_op.hEvent,INFINITE);
		ClearCommError(m_hComm, &dwErrorFlags, &ComStat);
		if (ComStat.cbInQue>0)
		{
			ReadFile(m_hComm,m_rcvbuf,40,&dwRead,&m_op);
		}	
		
	}
把WaitForSingleObject换成GetOverlappedResult还是这种情况
mrlgy 2014-07-03
  • 打赏
  • 举报
回复
我ReadFile已经把串口缓存中的40个字节读完了还是返回重叠I/O操作在进行中 我就搞不懂,是不是读完数据之后还有什么清理操作啊

18,141

社区成员

发帖
与我相关
我的任务
社区描述
Windows客户端使用相关问题交流社区
社区管理员
  • Windows客户端使用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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