原来有一个VB程序,关于接收数据部分是这样的(MSComm1是串口对象) Dim Rbuffer() As Byte '接收数据暂存
  Dim pn As Long '记录接收的数据
  Dim buffer(0 To 9830400) As Byte '接收数据暂存数组Do While MSComm1.InBufferCount > 0
        MSComm1.InputLen = 0
                  Rbuffer = MSComm1.Input
        For i = 0 To UBound(Rbuffer)    
                 buffer(pn) = Rbuffer(i)
                 pn = pn + 1
       Next i
       Label5.Caption = "正在采集数据,已完成" + Str$(Round(100 * pn / pnn, 1)) + "%"
         ProgressBar1.Value = pn
      DoEvents
Loop现在我要在VC中实现,我用了ACtiveX控件,在void CCSCommDlg::OnComm() 函数中接收数据,
if(m_MSComm.GetCommEvent()==2)时,开始接收
variant_inp=m_MSComm.GetInput();   //读缓冲区
safearray_inp=variant_inp;           //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度下面我就不知道怎么做了,m_MSComm.GetInput(); 是保证所有的数据都在缓存区里吗,还是说我这次接收的数据只是一部分,还需要读缓存区,请高手指点!

解决方案 »

  1.   

    SetInBufferSize(9830400)设置缓冲区大小
    GetInput()是你当前读取到的数据
      

  2.   

    我是在VC里面用的MSComm控件。GetInput()就是你将缓冲区的数据读取到你的变量里,串口收到的数据先放到缓冲区的。如果你要一次读取某个长度(比100),你就用SetRThreshold(100)。这样当缓冲区内的字节个数达到或超过100后就会产生OnComm()事件。希望对LZ有所帮助。
      

  3.   

    有两个问题,第一个,我在VB代码中没有看见设置缓存区大小的代码,具体如下Private Sub Command3_Click() '打开端口
       MSComm1.Settings = 576000 & ",n,8,1" '通信端口波特率选择
     If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
     MSComm1.InBufferCount = 0
    Shape1.FillColor = &HFF&
    End Sub是不是默认就接收所有数据?第二,在VC中我是不是可以设置很大的缓存区
    m_MSComm.SetInBufferSize(9830400); //接收缓冲区%%%%%%%%%%%%%
      

  4.   

    1.默认应该是 有数据就触发接收事件,然后全部读取
    2.你这个是设置缓冲区的大小 
    要设置
    m_MSComm.SetRThreshold(20)//这个是若受到20个字节数据就触发OnComm事件
      

  5.   

    VARIANT input1;                     //定义VARIANT类型变量
    BYTE rxdata[1024];                  //定义存放二进制数据的数组
    long len1,k;
    COleSafeArray safearray1;           //定义COleSafeArray类的实例
    CString strDis;
    switch(myComm.GetCommEvent())
    {
    case 2:         
                     myComm.SetInputLen(0);
     input1=myComm.GetInput();
     safearray1=input1;
     len1=safearray1.GetOneDimSize();
     for(k=0;k<len1;k++)
    safearray1.GetElement(&k,rxdata+k);
                if(//01 06 00 00 00 00 AA 55
                 (rxdata[0]==0x01)&&(rxdata[1]==0x06)
               &&(rxdata[2]==0x00)&&(rxdata[3]==0x00)
               &&(rxdata[4]==0x00)&&(rxdata[5]==0x00)
                       &&(rxdata[6]==0xAA)&&(rxdata[7]==0x55)
              )
    {
                   //数据保存成功
                    //m_StatusBar.SetText(_T("数据保存成功"), 3, 0);
    //m_StatusBar.SetText(_T("通讯正常"), 4, 0);
    //SetTimer(1,100,NULL);
    }
            else
    {
         //错误指令
      //   m_StatusBar.SetText(_T("数据保存失败"), 3, 0);
    }
    }
    break;
                          
      

  6.   

    饿刚么注意
    这个VB程序就是判断输入缓冲区有数据就读取,然后依次填充到数组里面,知道缓冲区没有数据为止
    VC 里面设置m_MSComm.SetRThreshold(0)//
    RxData[1024];
    int n;                        myComm.SetInputLen(0);//全部读取
         input1=myComm.GetInput();获取
         safearray1=input1;
         len1=safearray1.GetOneDimSize();
         //根据len1判断到底是什么命令?有必要?
         for(k=0;k<len1;k++)
         safearray1.GetElement(&k,rxdata+k);
                          for(k=0;k<len1;k++)
                           { 
                             RxData[n]=rxdata[k]
                             n=n+1;
                            }