大家好,我正在做一个串口通信的程序,用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;
}

解决方案 »

  1.   

    这个正常。
    你需要和底层定义好数据读完的结束符。循环调用ReadFile函数读取串口数据,直到读入结束符为止
      

  2.   

    谢谢你的回答,我参考的其他程序感觉只要调用readFile就可以了,我的怎么也不行;我传输的是Modbus下的RTU帧,起始与结束是3.5个字符间隔,自己不能定义帧的结构,后来我在调用自定义通信函数之前让监视线程Sleep了一下就能受到很多字符,发送的字符越多,所需要的时间越多;可是这种延时可能会影响性能,所以就设置了一个定时器,每收到一个字符就启动定时器,若时间超过3.5个字符时间就跳出循环,也不行,是不时有什么地方考虑的不对呢?