lyc158wan 发表于 2009-12-30 20:48:56

小弟有一个关于mscomm控件超时的问题请教高手!

我发一组数据给DSP,DSP会回我几个数(比如说8个数),
我现在要依次定时发送2组数据,我设了一个定时器每隔100ms发一组数,但是我发了数据以后DSP回我可能才收到第6个数时候我又发第二组数据了,(虽然说DSP处理数据很快,但有这种可能),或者我发了一组数据,DSP不返回我,因为我用的是mscomm控件,我不知道有没有这样的状态判断函数,比如说这个函数达到某个数值时,表明接受事件完成了,可以发送第二组数据,

我的发送是这样的:
void CSCommTestDlg::sendbufferdata()
{
        UpdateData(true);
    _SendDataOne=_send1;
    _SendDataTwo=_send2;
        _SendDataThree=_send3;
        _SendDataOne.Remove(' ');
        _SendDataTwo.Remove(' ');
        _SendDataThree.Remove(' ');
        len=_SendDataOne.GetLength();
        len=_SendDataTwo.GetLength();
        len=_SendDataThree.GetLength();
        if(len%2!=0||len%2!=0||len%2!=0) {AfxMessageBox("输入数据长度错误!");return;}
        else {
        if(len==0 && len==0 && len==0) {AfxMessageBox("输入数据长度错误!"); return;}       
       CharToHex(_SendDataOne,len);
        for(int i=0;i<len;i++)
        {        data=HexData;}
        CharToHex(_SendDataTwo,len);
        for(int i=0;i<len;i++)
        {        data=HexData;}
        CharToHex(_SendDataThree,len);
        for(int i=0;i<len;i++)
        {        data=HexData;}
        for(int i=0;i<3;i++)
        {        crc_write(&data,len/2);}
        if(m_strRXData.IsEmpty()==0)
        { m_strRXData+="\r\n";}
        UpdateData(false);}
}
bool CSCommTestDlg::SendOne(long Time)
{
    sendbufferdata();
        if(len!=0)
        {
        senddatacount+=(long)((len+4)/2);
        Count.Format("发送:%d",senddatacount);
        sendcount.SetWindowText(Count);
   CByteArray array;                                                            ////
        array.RemoveAll();
        //for(int j=0;j<3;j++)
        {
        for(int i=0;i<(len+4)/2;i++)
        {
                array.InsertAt(i,data,1);
        }
        m_ctrlComm.put_Output(COleVariant(array));//发送数据                              ////
        UpdateData(false);
        }
        for(int i=0;i<(len+4)/2;i++)
        {
                if(data>0x0F)
           SendDisplay.Format("%X ",data);
                else SendDisplay.Format("0%X ",data);
           m_strRXData+=SendDisplay;
        }
        }
       
    m_strRXData+="\r\n";                                                            ////
    UpdateData(FALSE);
       ReceiveOne();
        {
                SendFunc=SendTwo;
          return 0;
        }
}
bool CSCommTestDlg::SendTwo(long Time)                                             ////
{
        sendbufferdata();
        if(m_ctrlComm.get_CTSHolding()==true)
        {
        if(len!=0)
        {        senddatacount+=(long)((len+4)/2);
        Count.Format("发送:%d",senddatacount);
        sendcount.SetWindowText(Count);
        CByteArray array;
        array.RemoveAll();
        //for(int j=0;j<3;j++)
        {
        for(int i=0;i<(len+4)/2;i++)                                                          ////
        {
                array.InsertAt(i,data,1);
        }
       
        //if(m_ctrlComm.get_CommEvent()==1)
        m_ctrlComm.put_Output(COleVariant(array));//发送数据
        UpdateData(true);
        }
        for(int i=0;i<(len+4)/2;i++)
        {
                if(data>0x0F)                                                      ////
           SendDisplay.Format("%X ",data);
                else SendDisplay.Format("0%X ",data);
           m_strRXData+=SendDisplay;
        }
        }
        }
    m_strRXData+="\r\n";
       UpdateData(FALSE);
        ReceiveTwo();       
        //Sleep(1000);
        //if(quan==1)//.get_CommEvent()==7)
        SendFunc=SendThree;
        return 0;
}
bool CSCommTestDlg::SendThree(long Time)
{
    sendbufferdata();
        if(m_ctrlComm.get_CTSHolding()==true)
        {
        if(len!=0)
        {
        senddatacount+=(long)((len+4)/2);
        Count.Format("发送:%d",senddatacount);                                          ////
        sendcount.SetWindowText(Count);
        CByteArray array;
        array.RemoveAll();
        //for(int j=0;j<3;j++)
        {
        for(int i=0;i<(len+4)/2;i++)
        {
                array.InsertAt(i,data,1);
        }
        //if(m_ctrlComm.get_CommEvent()==1)
        m_ctrlComm.put_Output(COleVariant(array));//发送数据
        UpdateData(false);
        }
for(int i=0;i<(len+4)/2;i++)                                                    ////
        {
                if(data>0x0F)
           SendDisplay.Format("%X ",data);
                else SendDisplay.Format("0%X ",data);
           m_strRXData+=SendDisplay;
        }
        }
        }
    m_strRXData+="\r\n";
        UpdateData(FALSE);
        ReceiveThree();
        SendFunc=SendOne;
        return 1;
}
/////////////////////////////////////////////////接收第一、第二、第三个///////////////////////////////////////////
bool CSCommTestDlg::ReceiveOne()
{       
        Sleep(100);
return 0;
}
bool CSCommTestDlg::ReceiveTwo()                                                       ///
{
        Sleep(100);
return 0;
}
bool CSCommTestDlg::ReceiveThree()
{
Sleep(100);
return 1;                                                                            ////
}
接受事件:
void CSCommTestDlg::OnCommreceive()
{
        unsigned char aa;
        VARIANT variant_inp;
    COleSafeArray safearray_inp;
    LONG safe_len,k;
    BYTE rxdata; //设置BYTE数组 An 8-bit integerthat is not signed.
    CString strtemp;
        if(m_ctrlComm.get_CommEvent()==2) //事件值为2表示接收缓冲区内有字符
    {   
                ////////以下你可以根据自己的通信协议加入处理代码
                variant_inp=m_ctrlComm.get_Input(); //读缓冲区
           safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
      safe_len=safearray_inp.GetOneDimSize(); //得到有效数据长度
                for(k=0;k<safe_len;k++)
                {                       
                        safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
                }
      for(k=0;k<safe_len;k++) //将数组转换为Cstring型变量
      {       
                        BYTE bt=*(char*)(rxdata+k); //字符型
                        if(bt>0x0f)
            strtemp.Format("%x ",bt);//]bt); //将字符送入临时变量strtemp存放
                        else strtemp.Format("0%x ",bt);//bt);
                        m_strRXData+=strtemp; //加入接收编辑框对应字符串
                        receivedatacount++;
                  CString ReceiveDataNum;
              ReceiveDataNum.Format("%ld", receivedatacount);
                        ReceiveDataNum="接收:"+ReceiveDataNum;
                receivecount.SetWindowText(ReceiveDataNum);
            UpdateData(FALSE);
                }
}
我接受都是利用的Sleep(100);这样虽然在接受时没有问题,但是这程序编的是有漏洞的,希望各位大侠能够帮帮小弟!感激不尽!

lyc158wan 发表于 2009-12-30 20:59:54

回复【楼主位】lyc158wan
-----------------------------------------------------------------------

源程序点击此处下载 ourdev_520797.rar(文件大小:3.87M) (原文件名:SCommTest.rar)

zht9961020 发表于 2009-12-30 21:10:05

最好是自己用API写,想怎么控制都行

lyc158wan 发表于 2009-12-30 21:14:39

回复【2楼】zht9961020
--------------------------------------------------------------------
我都用mscomm控件做的差不多了,就差这个问题了,现在打断全部重来写API的话比较麻烦,

lokily 发表于 2010-3-24 17:24:22

设置你的接收响应就可以了 ,比如你说dsp返回给你8个数据,那就收到8个数据才进行com的接收处理,例如下面代码:
void XXXXX::SetRThreshold(CMSComm *pCOM,int RThreshold)
{
      pCOM->SetRThreshold(RThreshold);//RThreshold你这里传8
}
这样设置以后,每当8个数据传回来后,才触发你程序中的 void CSCommTestDlg::OnCommreceive() ,否则你的程序是不走这个函数的
页: [1]
查看完整版本: 小弟有一个关于mscomm控件超时的问题请教高手!