请问:串口通信中 "超时重发" 问题的最佳解决方法?我是用定时器实现的,具体是这样做的:
当 "串口收到数据" 或者 "定时器到时" 都会自动触发对数据的处理事件,
如果数据为空,则判为超时,继续重发;
如果不空,则对数据进行校验.不知道这样做对整个系统的工作效率是否会有影响?
请问大家还有什么更好的方法,可以提高运行效率?

解决方案 »

  1.   

    顺便说一下,我采用的是Mscomm控件.
      

  2.   

    定时器?定时扫描吗?
    Mscomm不是采取得消息么?你在对它的事件处理函数中处理你的数据就行了啊
      

  3.   

    定时器?定时扫描吗?
    Mscomm不是采取得消息么?你在对它的事件处理函数中处理你的数据就行了啊
    --------------------------------------------------------------------这个我知道
    我是超时的问题有什么更好的解决方法?可以用进程等待,可能比较麻烦吧!
      

  4.   

    You can consult the API function WaitCommEvent()
    and some other function about ...Comm...()
      

  5.   

    我用定时器也能实现预期效果,不这样做是否妥当???
    附上源代码: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;
    }