+ -
当前位置:首页 → 问答吧 → 再谈MSComm控件接收大量数据的问题!

再谈MSComm控件接收大量数据的问题!

时间:2011-12-16

来源:互联网

    大家好,这个问题应该比较常见,但我还是不完全理解,为此又发帖寻求大家的帮助!
    我要接收的数据量最大是32KB,当接收一二百个字节时没有任何问题,但是有时接收甚至超过二百就出现问题了。奇怪的是有时候接收上万个字节也能接收到。我的代码如下:设置参数为19200,N,8,1
m_com.SetInBufferSize(0x7FFE);   //输入缓冲区
m_com.SetOutBufferSize(1024);     //输出缓冲区
m_com.SetPortOpen(TRUE); //打开串口
m_com.SetInputMode(1);       //以二进制方式检取数据
m_com.SetRThreshold(1);//多于或等于1个字符时,将引发OnComm事件
m_com.SetInputLen(0);//设置当前接收区数据长度为0,表读取全部数据
m_com.GetInput();   //预读以清除数据
OnComm函数主要内容如下:
switch(m_com.GetCommEvent())
case   2:
      {
VARIANT   variant_inp;
COleSafeArray   safearray_inp;
LONG   len,k;
CString   strtemp,stringe;
variant_inp=m_com.GetInput();//读取缓冲区
safearray_inp=variant_inp; //VARIANT型变量转为ColeSageArray型变量
len=safearray_inp.GetOneDimSize();//得到有效数据长度
for(k=0;k <len;k++)
{
safearray_inp.GetElement(&k,rxdata+m_readLen+k);//转为BYTE型数组
}
m_readLen=m_readLen+len;

                  //接收的数据已经存到rxdata数组中
//检查数据格式对否
if(CheckData(rxdata,m_readLen))//这里经常难以通过。。。
{
                          for(k=0;k <m_readLen;k++)
  {
g_recevData[k]=rxdata[k];         //转存到全局数组
  }
            m_com.SetInBufferCount(0);     //(添加)清空接收缓冲区内容等待下次接收
            m_readLen=0;                 //转存完毕后,将m_readLen设为0;                    
            sArrive=TRUE;             //设置可以读标志
}
else
{
                            AfxMessageBox( "数据检查不通过 ");

}
  break;
}
default:
break;
}
这里还有个问题,有时候如果第一次接收没有成功,则下次再接收另外一组数据也难以成功,从而导致验证数据格式也失败!对应MSComm控件接收大数据问题,大家有什么好的方法啊?

作者: zzf19870622   发布时间: 2011-12-16

很少用mscomm,直接用api来的比较简单方便.

作者: yjz1409276   发布时间: 2011-12-16