请问:串口通信中 "超时重发" 问题的最佳解决方法?我是用定时器实现的,具体是这样做的:
当 "串口收到数据" 或者 "定时器到时" 都会自动触发对数据的处理事件,
如果数据为空,则判为超时,继续重发;
如果不空,则对数据进行校验.不知道这样做对整个系统的工作效率是否会有影响?
请问大家还有什么更好的方法,可以提高运行效率?
当 "串口收到数据" 或者 "定时器到时" 都会自动触发对数据的处理事件,
如果数据为空,则判为超时,继续重发;
如果不空,则对数据进行校验.不知道这样做对整个系统的工作效率是否会有影响?
请问大家还有什么更好的方法,可以提高运行效率?
Mscomm不是采取得消息么?你在对它的事件处理函数中处理你的数据就行了啊
Mscomm不是采取得消息么?你在对它的事件处理函数中处理你的数据就行了啊
--------------------------------------------------------------------这个我知道
我是超时的问题有什么更好的解决方法?可以用进程等待,可能比较麻烦吧!
and some other function about ...Comm...()
附上源代码:void CComTestView::OnOnCommMscomm1()
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放
strRXData+=strtemp; //加入接收编辑框对应字符串
}
}
m_strRXData+="接收成功! ";
OnTimer(1); //收到数据可提前出发定时器,提高运行效率
}void CComTestView::OnQueryTask()
{
UpdateData(TRUE);
nCurrent=0;
nTimes=0;
strRXData = _T(""); m_strRXData= _T("");
OnSend(scm[nCurrent].chAddr); SetTimer(1,100,NULL);
}void CComTestView::OnTimer(UINT nIDEvent)
{
if(nIDEvent==1)
{
CString s;
s.Format("%d ",nCurrent); if(nCurrent>=nJudge) //轮询完毕
{
KillTimer(1);
nCurrent=0;
UpdateData(FALSE);
return;
}
else
{
if(strRXData=="")
{
nTimes++;
m_strRXData+="接收超时! ";
}
else
{
s.Format("%d ",strRXData.GetAt(0));
if(strRXData.GetAt(0)!=scm[nCurrent].chAddr)
{
nTimes++;
m_strRXData+=" 返回 "+s+" ---------> 不符!\r\n";
}
else
{
nTimes=0; //正确接收,握手成功,转下一单片机
scm[nCurrent++].bConnect=TRUE;
m_strRXData+=" 返回 "+s+" ---------> 相符! 与 "+s+" 连接成功\r\n\r\n";
}
strRXData = _T("");
} if(nTimes>0&&nTimes<3)
{
s.Format("%d",nTimes+1);
m_strRXData+=" 尝试第 "+s+" 次连接!\r\n";
}
if(nTimes>=3) //超时3次,跳过
{
nTimes=0;
scm[nCurrent++].bConnect=FALSE; //与该单片机连接失败
m_strRXData+=" 断开与 "+s+" 的连接!\r\n\r\n";
}
} if(nCurrent<nJudge)
{
OnSend(scm[nCurrent].chAddr);
}
UpdateData(FALSE);
}
CFormView::OnTimer(nIDEvent);
}bool CComTestView::OnSend(char chSend)
{
CString str;
str.Format("%c",chSend);
m_ctrlComm.SetOutput(COleVariant(str));//发送数据 str.Format("Current = %d ,发送 %d 成功! \r\n",nCurrent,chSend); //为便于显示,char转成int
m_strRXData+=str;
UpdateData(FALSE);
return true;
}