大家好,我正在做一个串口通信的程序,用API函数,可是接收的时候总是分段接收,每次8个,而在调试的时候却显示全部接收到了我定义的数组中,能显示正确结果,为什么呢?我的代码:
//-----------------接收数据处理------------------
DWORD CMultiTestView::RecvData(char *buffer, DWORD dwLength)
{
BOOL IsRecv;
COMSTAT ComStat;
DWORD length=0;
DWORD dwErrorFlags; //char *buf;//......................
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
length=min(dwLength,ComStat.cbInQue);
IsRecv=ReadFile(m_hCom,buffer,length,&length,&m_osR);
// IsRecv=ReadFile(m_hCom,buffer,1,&length,&m_osR);
if(IsRecv)
{
SetTimer(1,3.5/9600,NULL);
m_bRecvTimeOuts=FALSE;
return length;
}
else
{
if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom,&m_osR,&length,true);
return length;
}
else
{
MessageBox("读串口错误");
return 0;
}
}
}
自定义函数处理接收数据:
LONG CMultiTestView::OnCommunication(WPARAM wParam,LPARAM lParam)
{
char buf[1024],Data[1024];
int nLength=0;
CString str;
memset(buf,0,1024);
int nNum;
DWORD dwError;//...................
COMSTAT ComStat;//.............................
ClearCommError(m_hCom,&dwError,&ComStat);//...................
if(!m_bConnected && (wParam & EV_RXCHAR) !=EV_RXCHAR)////////////////
{
SetEvent(m_hPostMsgEvent);//将m_hPostMsgEvent置为有信号
return 0;
}
//..................判断一个帧的结束............................................
nNum=ComStat.cbInQue;
int i=0;
for(i=0;i<nNum;i++)
{
int OldLen=nLength;
nLength=RecvData(&buf[i],1);//读入一个字符
Data[i]=buf[i]; if(m_bRecvTimeOuts && !nLength)//超时时,m_bRecvTimeOuts设为TRUE,读完一帧
{
break;
}
} nLength=i;
//.........................................................................
// nLength=RecvData(buf,100);
if(nLength)
{
for(int i=0;i<nLength;i++)
{
switch(buf[i])
{
case '\r':
break;
case '\n':
str+="\r\n";
break;
default:
str+=buf[i];
break;
}
}
str+='\0';
SetDlgItemText(IDC_RECVDATA,str);
}
SetEvent(m_hPostMsgEvent);
return 0;
}
//-----------------接收数据处理------------------
DWORD CMultiTestView::RecvData(char *buffer, DWORD dwLength)
{
BOOL IsRecv;
COMSTAT ComStat;
DWORD length=0;
DWORD dwErrorFlags; //char *buf;//......................
ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
length=min(dwLength,ComStat.cbInQue);
IsRecv=ReadFile(m_hCom,buffer,length,&length,&m_osR);
// IsRecv=ReadFile(m_hCom,buffer,1,&length,&m_osR);
if(IsRecv)
{
SetTimer(1,3.5/9600,NULL);
m_bRecvTimeOuts=FALSE;
return length;
}
else
{
if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(m_hCom,&m_osR,&length,true);
return length;
}
else
{
MessageBox("读串口错误");
return 0;
}
}
}
自定义函数处理接收数据:
LONG CMultiTestView::OnCommunication(WPARAM wParam,LPARAM lParam)
{
char buf[1024],Data[1024];
int nLength=0;
CString str;
memset(buf,0,1024);
int nNum;
DWORD dwError;//...................
COMSTAT ComStat;//.............................
ClearCommError(m_hCom,&dwError,&ComStat);//...................
if(!m_bConnected && (wParam & EV_RXCHAR) !=EV_RXCHAR)////////////////
{
SetEvent(m_hPostMsgEvent);//将m_hPostMsgEvent置为有信号
return 0;
}
//..................判断一个帧的结束............................................
nNum=ComStat.cbInQue;
int i=0;
for(i=0;i<nNum;i++)
{
int OldLen=nLength;
nLength=RecvData(&buf[i],1);//读入一个字符
Data[i]=buf[i]; if(m_bRecvTimeOuts && !nLength)//超时时,m_bRecvTimeOuts设为TRUE,读完一帧
{
break;
}
} nLength=i;
//.........................................................................
// nLength=RecvData(buf,100);
if(nLength)
{
for(int i=0;i<nLength;i++)
{
switch(buf[i])
{
case '\r':
break;
case '\n':
str+="\r\n";
break;
default:
str+=buf[i];
break;
}
}
str+='\0';
SetDlgItemText(IDC_RECVDATA,str);
}
SetEvent(m_hPostMsgEvent);
return 0;
}
你需要和底层定义好数据读完的结束符。循环调用ReadFile函数读取串口数据,直到读入结束符为止