为什么每次读取缓冲区数据都会分两次读取,假如对方从串口发送“123456789123456789”十八个字符,而串口读取总是分开来读,第一次读“1234567891”十个字符,第二次读“23456789”八个字符,为什么不能一次读取完,当发送超过8个字符是,无论第一次去多少,第二次可定是八个字符,下面附上部分程序,希望大侠帮看看哪出问题,怎么解决。
//线程调用函数
DWORD CSerialPort::ThreadFunc()
{
if(!::SetCommMask(h_Com, dwMaskEvent))
{
return 1;
}
COMSTAT ComStat;
DWORD dwError;
for (DWORD dwLength, dwMask=0; fRunFlag && IsOpen(); dwMask = 0)
{
if(!::WaitCommEvent(h_Com, &dwMask, &WaitOverlapped))
{
if(::GetLastError() == ERROR_IO_PENDING)
::GetOverlappedResult(h_Com, &WaitOverlapped, &dwLength, TRUE);
else
continue;
}
if(dwMask == 0)
continue;
switch(dwMask)
{
case EV_RXCHAR:
::ClearCommError(h_Com, &dwError, &ComStat);
if(ComStat.cbInQue >= dwNotifyNum)
OnReceive();
break;
case EV_TXEMPTY:
OnTXEmpty();
break;
case EV_DSR:
OnDSR();
break;
case EV_CTS:
OnCTS();
break;
case EV_RING:
OnRing();
break;
case EV_RLSD:
OnRLSD();
break;
case EV_BREAK:
OnBreak();
break;
case EV_ERR:
OnError();
break;
default:
break;
}
}
return 0;
}
//消息处理相关函数
void CSerialPort::OnReceive()
{
if(::IsWindow(hNotifyWnd))
::PostMessage(hNotifyWnd, ON_COM_RECEIVE, WPARAM(_nPort), LPARAM(0));
}
//读取串口函数
DWORD CSerialPort::Read(LPVOID Buffer, DWORD dwBufferLength)
{
DWORD dwNumRead;
DWORD dwErrorMask, dwLength;
DWORD dwEndTime;
COMSTAT Comstat;
ClearCommError(h_Com, &dwErrorMask, &Comstat);
dwEndTime=GetTickCount() + 30;
while(GetTickCount() <= dwEndTime)
{
if(Comstat.cbInQue)
break;
}
if(!Comstat.cbInQue)
return 0;
dwLength = min((DWORD)dwBufferLength, Comstat.cbInQue);
if(!(ReadFile(h_Com, Buffer, dwLength, &dwNumRead, &ReadOverlapped)))
{
if(GetLastError() == ERROR_IO_PENDING)
{
WaitForSingleObject(ReadOverlapped.hEvent, 100);
return dwNumRead;
}
return 0;
}
return dwNumRead;
}
//消息处理函数
LRESULT CRFIDChickenDlg::OnComRecieve(WPARAM wParam,LPARAM lParam)
{
if((wParam & EV_RXCHAR) != EV_RXCHAR)
return S_OK;
char InBuf[256] = "\0";
int nReadNum = 0;
nReadNum = m_Port.Read(InBuf, 256);//从串口中读取字节
if(nReadNum == 0)
{
return S_OK;
}
CString msg;
msg.Format(_T("%d"),nReadNum);
AfxMessageBox(msg);//显示读取字符个数
CString DataPacket;
DataPacket.Format(_T("%s"),InBuf);
m_strRecieve = DataPacket;
UpdateData(FALSE);
}//其中m_strRecieve是文本控件变量,显示读取内容
//设置串口
BOOL CSerialPort::SetupPort()
{
if(!IsOpen())
return FALSE;
if(!::SetupComm(h_Com, 4096, 4096))
return FALSE;
if(!::GetCommTimeouts(h_Com, &TimeOuts))
return FALSE;
TimeOuts.ReadIntervalTimeout = 0;
TimeOuts.ReadTotalTimeoutMultiplier = 1;
TimeOuts.ReadTotalTimeoutConstant = 1000;
TimeOuts.WriteTotalTimeoutMultiplier = 1;
TimeOuts.WriteTotalTimeoutConstant = 1000;
if(!::SetCommTimeouts(h_Com, &TimeOuts))
return FALSE;
    if (!::PurgeComm(h_Com, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR))
        return false;
return TRUE;
}//先谢谢拉