用VC编写的串口通信程序,总是数据接收不全,这是为什么啊该怎么处理

用VC编写的串口通信程序,总是数据接收不全,这是为什么啊
接收线程代码如下:
UINT CommProc(LPVOID lpParam)
{
OVERLAPPED os;
DWORD dwMask, dwTrans;
COMSTAT ComStat;
DWORD dwErrorFlags;

CDataSource_Serial* pDS = (CDataSource_Serial*)lpParam;

memset (&os, 0, sizeof(OVERLAPPED));
os.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

if (os.hEvent == NULL)
{
AfxMessageBox("创建辅助线程事件失败");
return (UINT)-1;
}

while (TRUE) 
{
dwMask = 0;
//异步操作,等待串口事件,等待结果在dwMask中
if (!WaitCommEvent(pDS->m_hCom, &dwMask, &os))
{
if (GetLastError() == ERROR_IO_PENDING)
{
GetOverlappedResult(pDS->m_hCom, &os, &dwTrans, TRUE);
}
else //等待串口事件时出错
{
CloseHandle(os.hEvent);
return (UINT)-1;
}
}

//清除串口可能发生的错误
Sleep(500);
ClearCommError(pDS->m_hCom, &dwErrorFlags, &ComStat);

if (ComStat.cbInQue)
{
//无限等待事件触发
WaitForSingleObject(pDS->m_hEvent, INFINITE);
ResetEvent(pDS->m_hEvent);

//调用接收函数,在该函数中重新触发m_hEvent
pDS->ReceiveData(dwMask);
continue;
}
}
CloseHandle(os.hEvent);
return 0;
}

DWORD CDataSource_Serial::ReceiveData(DWORD dwMask)
{
int nLength;

//如果收到的不是EV_RXCHAR信息,则函数直接返回
if ( (dwMask & EV_RXCHAR) != EV_RXCHAR )
{
//使m_hEvent成为有信号,即允许再次调用ReceiveData函数
SetEvent(m_hEvent);
return 0;
}

DWORD dwErrorFlags;
COMSTAT ComStat;

int i;
ClearCommError(m_hCom, &dwErrorFlags, &ComStat);

nLength = ReadComm(m_pucRecvBuff, ComStat.cbInQue);

CString str;
str.Format("接收到%d个数据!\n", nLength);
m_RecvFile.WriteString(str);

//将接收到的数据存入处理缓冲
memcpy(m_ProcBuff, m_pucRecvBuff, nLength);

if (!DataProcess(nLength))
m_RunFile.WriteString("处理接收数据失败!\n");
//使m_hEvent成为有信号,即允许再次调用ReceiveData函数
SetEvent(m_hEvent);
return 0;
}

ReadComm应该读出380个字节,可是ClearCommError(m_hCom, &dwErrorFlags, &ComStat);以后,ComStat.cbInQue的结果有时候读出4个,有时候读出8个,还有时候都不全,请高手指点一下,是不是超时设置有问题,我的超时是这么设置的
//设定读超时
TimeOuts.ReadIntervalTimeout = MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier = MAXDWORD;
TimeOuts.ReadTotalTimeoutConstant = MAXDWORD;

//设定写超时
TimeOuts.WriteTotalTimeoutConstant = 50;
TimeOuts.WriteTotalTimeoutMultiplier = 1000;

------解决方案--------------------
你是不是读了几个字节之后就退出了?
------解决方案--------------------
没读完整就继续读啊,不要以为调用一次就能够完全读完的。