当前位置: 代码迷 >> WinCE >> WINCE串口通信 COMSTAT.cbInQue 长度跟发的字节数不一致的有关问题
  详细解决方案

WINCE串口通信 COMSTAT.cbInQue 长度跟发的字节数不一致的有关问题

热度:478   发布时间:2016-04-28 11:53:06.0
WINCE串口通信 COMSTAT.cbInQue 长度跟发的字节数不一致的问题?
若发送字节小于32个字节 COMSTAT.cbInQue 长度返回正确 
若发送字节大于32个字节 COMSTAT.cbInQue 长度返回固定为32 、其余的下次才会接收到
如果定时发送的时间比较快,则第一次返回长度32字节 第二次可能几百上千字节

实际就是第一次最多只能接收到32字节的数据,数据包没有丢失,因为我是向下面读数据,一般我读三次还是会有正确的数据包返回,但是第一次接受的包只为32字节(若实际返回包长度大于32)

我同样的串口类函数,如果在Win32平台下,数据发多少,缓冲区接收多少,只有在Wince平台(ARM ac440)下才会出现这种问题


//串口0读线程函数
DWORD CCESeries::ReadThreadFunc0(LPVOID lparam)
{
CCESeries *ceSeries = (CCESeries*)lparam;

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

DWORD dwReadErrors;
COMSTAT cmState;

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

//清空串口
PurgeComm(ceSeries->m_hComm0, PURGE_RXCLEAR | PURGE_TXCLEAR );
//设置串口事件集
SetCommMask (ceSeries->m_hComm0, EV_RXCHAR | EV_CTS | EV_DSR ); //接收到一个字符,CTS改变了状态,DSR信号改变了状态
while (TRUE)
{   
if (WaitCommEvent(ceSeries->m_hComm0,&evtMask,0))
{
SetCommMask (ceSeries->m_hComm0, EV_RXCHAR | EV_CTS | EV_DSR );
//表示串口收到字符
if (evtMask & EV_RXCHAR) 
{
ClearCommError(ceSeries->m_hComm0,&dwReadErrors,&cmState);
willReadLen = cmState.cbInQue ;  //接收缓冲区存储的待读取的字符数.........................第一次总是32字节
if (willReadLen <= 0) //如果没有数据,那么再等待
{
continue;
}

//分配内存
readBuf = new BYTE[willReadLen];
ZeroMemory(readBuf,willReadLen);

//读取串口数据
ReadFile(ceSeries->m_hComm0, readBuf, willReadLen, &actualReadLen,0);

//如果读取的数据大于0,
if (actualReadLen>0)
{
//触发读取回调函数
if (ceSeries->m_OnSeriesRead0)
{
ceSeries->m_OnSeriesRead0(readBuf,actualReadLen);
}
}
//释放内存
delete[] readBuf;
readBuf = NULL;
}
}
else
{
AfxMessageBox(_T("sadsd"));
}
//如果收到读线程退出信号,则退出线程
if (WaitForSingleObject(ceSeries->m_hReadCloseEvent0,500) == WAIT_OBJECT_0)
{
break;
}
}
return 0;
}
------解决思路----------------------
WinCE 下的串口程序虽然说与 PC 上相似,但也不能用来做对比。
试着修改一下串口的发送与接收的参数吧,例如:接收超时设置。
------解决思路----------------------
自己写个接收数据,判断自定义的超时时间
  相关解决方案