当前位置: 代码迷 >> WinCE >> WINCE 串口接收 怎么判断超时 如何处理一直死等
  详细解决方案

WINCE 串口接收 怎么判断超时 如何处理一直死等

热度:390   发布时间:2016-04-28 11:51:43.0
WINCE 串口接收 如何判断超时 如何避免一直死等
各位 我用一下代码接收串口数据 
DWORD CCESeries::ReadThreadFunc(LPVOID lparam)
{
CCESeries *ceSeries = (CCESeries*)lparam;

DWORD evtMask;
BYTE * readBuf = NULL;//读取的字节
DWORD actualReadLen=0;//实际读取的字节数
DWORD willReadLen;

DWORD dwReadErrors;
COMSTAT cmState;

// 清空缓冲,并检查串口是否打开。
ASSERT(ceSeries->m_hComm !=INVALID_HANDLE_VALUE); 


//清空串口
PurgeComm(ceSeries->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR );

SetCommMask (ceSeries->m_hComm, EV_RXCHAR|EV_RXCHAR | EV_CTS | EV_DSR );
while (TRUE)
{   
if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))
{
SetCommMask (ceSeries->m_hComm, EV_RXCHAR|EV_TXEMPTY | EV_CTS | EV_DSR );
//表示串口收到字符
if (evtMask & EV_RXCHAR) 
{
ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);
willReadLen = cmState.cbInQue ;
if (willReadLen <= 0)
{
continue;
}

//分配内存
readBuf = new BYTE[willReadLen];
ZeroMemory(readBuf,willReadLen);
//读取串口数据
ReadFile(ceSeries->m_hComm, readBuf, willReadLen, &actualReadLen,0);

//如果读取的数据大于0,
if (actualReadLen>0)
{
//触发读取回调函数
if (ceSeries->m_OnSeriesRead)
{
ceSeries->m_OnSeriesRead(ceSeries->m_pOwner,readBuf,actualReadLen);
}
}

//释放内存
delete[] readBuf;
readBuf = NULL;
}
}
//如果收到读线程退出信号,则退出线程
if (WaitForSingleObject(ceSeries->m_hReadCloseEvent,500) == WAIT_OBJECT_0)
{
break;
}
}
return 0;
}
若串口故障 此句if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))一直将死等,如何避免接收函数死等问题
------解决思路----------------------
串口接收线程,没有数据时死等是正常的设计。
没有数据到达,这什么要返回呢?
------解决思路----------------------
引用:
我底下硬件有8个串口模块,我需要软件切换来接收每个模块的数据,要是一个模块坏掉了,就死等了,没法接收其余的模块数据了,所以想避免这个死等,不知道怎么做?


8 个串口,同时接收、还是轮换?
一般来说是同时接收。同时接收就需要8个接收线程,而不是在一个线程中等 8 个串口的数据。
------解决思路----------------------
好怪异的设计啊,8个串口独立开来多好。
------解决思路----------------------
没有其它建议,只有一个:各个串口独立线程处理
------解决思路----------------------
我之前做过类似的东西,必须使用多个线程。
------解决思路----------------------
开八个!!!!
  相关解决方案