解决方案 »

  1.   

    好嘞,是这样的,我用串口MSComm控件接收机器采样数据,我想将串口采样回来的数据,先将它们接收过来,缓冲一下再从这些大量采样数据(是以0xcd开头的3字节ad采样数据)中,实时找到找到例如停止指令成功执行的反馈代码(0xff)!本来采用的是边接受边处理,发现处理不过来,缓冲区老是堆积数据,就收不到不知何时到来的停止数据(0xff)数据!停止命令什么时候点击,下位机就立马停止发送ad数据,并反馈回0xff!
      

  2.   

    难点是快速的从大量的ad数据中快速的检测到停止指令反馈指令0xff!求指教!
      

  3.   

    用DataReceived消息响应
    接收的数据存数组(数据可用定时器访问处理),接收的指令立即执行。
      

  4.   

    楼上说的好像是vb.net.呵呵,我使用的是vb6.0,有对应的办法没?亲
      

  5.   

    在mscomm的oncomm事件中处理。可以一个字节一个字节的处理。
    在收到数据后先判断分类,不是命令响应的作为数据处理,是命令响应的作为命令反馈处理。
      

  6.   

    用delphi写的mscomm,MSComm.InBufferSize := 1024;每次oncomm时,将接收的数据拼接在FStr变量中,然后判断Fstr中是否有结束符,没有继续,有则清空Fstr;
    procedure .mscm_ABX60Comm(Sender: TObject);
    var
      s: string;
      InputLen: Integer;
    begin
      if mscm_ABX60.CommEvent = 2 then //接收数据时
      begin
        begin
          InputLen := mscm_ABX60.InBufferCount; //返回输入缓冲区内等待读取的字节数
          if InputLen >= 1 then       //RThreshold=1
          begin
            s := '';
            s := mscm_ABX60.Input;
            Fstr := Fstr + s;
            if Pos(#03,s) <> 0 then
            begin
              jxABX60(Fstr);  //解析数据
              syslog.Msg := fstr;  //保存日志
              sxJyjg;   //结果刷新
              mscm_ABX60.InBufferCount := 0;
              Fstr := '';
            end;
          end;
        end;
      end;
    end;
      

  7.   


    '定义一个数据缓冲池,这里用Collection对象作缓冲池,你也可以用数组或其他东西
    Dim coldata As Collection
     
    Private Sub Form_Load()
        '初始化数据缓冲池
        Set coldata = New Collection
     
        '初始化并打开串口
        MSComm1.CommPort = 1
        MSComm1.Settings = "9600, n, 8, 1"
        MSComm1.RThreshold = 1     '设置为每收到一个字节数据触发一次Oncomm事件
        MSComm1.InputMode = comInputModeBinary
        MSComm1.PortOpen = True
    End Sub
     
    Private Sub MSComm1_OnComm()
    Dim yy As Long
    Select Case MSComm1.CommEvent
    Case comEvReceive
        Dim xx() As Byte
        xx = MSComm1.Input
        For yy = 0 To UBound(xx) '把串口接收到的所有数据都先保存到数据缓冲池暂时不去处理,因为无法保证数据已经接收完整
            coldata.Add xx(yy)
        Next yy
    End Select
    End Sub
     
    '用Timer控件循环对接收到的数据进行处理
    Private Sub Timer1_Timer()
        if coldata.count<6 then exit sub   '收到的数据不足6个
     
        Dim xx As Long
        For xx = 1 To coldata.Count     '遍历所有串口收到的数据
             if coldata.item(1)<>&H3F then 
                coldata.remove(1)    '收到的第一个字节不是3F,丢弃
                exit for
            end if
     
            '……  代码略,按照通讯协议对串口收到的数据进行分析和处理
            '…… 处理完成及时把已处理的数据从缓冲池中移除
        Next xx
    End SubN年以前写的一段代码,可以参考下