搜索
bottom↓
回复: 4

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

[复制链接]

出0入0汤圆

发表于 2009-12-30 20:48:56 | 显示全部楼层 |阅读模式
我发一组数据给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[0]=_SendDataOne.GetLength();
        len[1]=_SendDataTwo.GetLength();
        len[2]=_SendDataThree.GetLength();
        if(len[0]%2!=0||len[1]%2!=0||len[2]%2!=0) {AfxMessageBox("输入数据长度错误!");return;}
        else {
        if(len[0]==0 && len[1]==0 && len[2]==0) {AfxMessageBox("输入数据长度错误!"); return;}       
         CharToHex(_SendDataOne,len[0]);
        for(int i=0;i<len[0];i++)
        {        data[0]=HexData;}
        CharToHex(_SendDataTwo,len[1]);
        for(int i=0;i<len[1];i++)
        {        data[1]=HexData;}
        CharToHex(_SendDataThree,len[2]);
        for(int i=0;i<len[2];i++)
        {        data[2]=HexData;}
        for(int i=0;i<3;i++)
        {        crc_write(&data[0],len/2);}
        if(m_strRXData.IsEmpty()==0)
        { m_strRXData+="\r\n";}
        UpdateData(false);}
}
bool CSCommTestDlg::SendOne(long Time)
{
    sendbufferdata();
        if(len[0]!=0)
        {
        senddatacount+=(long)((len[0]+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[0]+4)/2;i++)
        {
                array.InsertAt(i,data[0],1);
        }
        m_ctrlComm.put_Output(COleVariant(array));//发送数据                              ////
        UpdateData(false);
        }
        for(int i=0;i<(len[0]+4)/2;i++)
        {
                if(data[0]>0x0F)
           SendDisplay.Format("%X ",data[0]);
                else SendDisplay.Format("0%X ",data[0]);
           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[1]!=0)
        {        senddatacount+=(long)((len[1]+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[1]+4)/2;i++)                                                          ////
        {
                array.InsertAt(i,data[1],1);
        }
       
        //if(m_ctrlComm.get_CommEvent()==1)
        m_ctrlComm.put_Output(COleVariant(array));//发送数据
        UpdateData(true);
        }
        for(int i=0;i<(len[1]+4)/2;i++)
        {
                if(data[1]>0x0F)                                                        ////
           SendDisplay.Format("%X ",data[1]);
                else SendDisplay.Format("0%X ",data[1]);
           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[2]!=0)
        {
        senddatacount+=(long)((len[2]+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[2]+4)/2;i++)
        {
                array.InsertAt(i,data[2],1);
        }
        //if(m_ctrlComm.get_CommEvent()==1)
        m_ctrlComm.put_Output(COleVariant(array));//发送数据
        UpdateData(false);
        }
for(int i=0;i<(len[2]+4)/2;i++)                                                    ////
        {
                if(data[2]>0x0F)
           SendDisplay.Format("%X ",data[2]);
                else SendDisplay.Format("0%X ",data[2]);
           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[1024];
        VARIANT variant_inp;
    COleSafeArray safearray_inp;
    LONG safe_len,k;
    BYTE rxdata[1024]; //设置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);这样虽然在接受时没有问题,但是这程序编的是有漏洞的,希望各位大侠能够帮帮小弟!感激不尽!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-12-30 20:59:54 | 显示全部楼层
回复【楼主位】lyc158wan
-----------------------------------------------------------------------

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

出0入0汤圆

发表于 2009-12-30 21:10:05 | 显示全部楼层
最好是自己用API写,想怎么控制都行

出0入0汤圆

 楼主| 发表于 2009-12-30 21:14:39 | 显示全部楼层
回复【2楼】zht9961020
--------------------------------------------------------------------
我都用mscomm控件做的差不多了,就差这个问题了,现在打断全部重来写API的话比较麻烦,

出0入0汤圆

发表于 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() ,否则你的程序是不走这个函数的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 23:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表