使用spcomm控件,波特率9600,每次接收22个字节,截取其中的第6-21个为有效数据,总共接收2000次,有效数据32K
代码如下
procedure TFmComm.CommDataReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
  i:integer;
  lBuffer:array[1..maxBuffer] of Byte;
  lReceiveResult:array[1..4] of Byte;
  viewstring:string;
begin
  move(buffer^,lBuffer,bufferlength);//接收数据到缓冲
  if (BufferLength>1) and (uppercase(inttohex(lBuffer[1],2))='07') then
  begin
    if not dataVerify(lBuffer[BufferLength],CalcVerifycode(@lBuffer,BufferLength)) then
    begin
      viewstring:='';
      for i:=1 to BufferLength do
      begin
        viewstring:=viewstring+inttohex(lBuffer[i],2)+'';
      end;
      if _IsDebug=1 then
        MemComm.Lines.Add(viewstring);
      lReceiveResult[1]:=_0B;
      lReceiveResult[2]:=strtoint('$'+copy(Fullstr(CommBNo,'0',4),1,2));
      lReceiveResult[3]:=strtoint('$'+copy(Fullstr(CommBNo,'0',4),3,2));
      lReceiveResult[4]:=CalcVerifyCode(@lReceiveResult,4);
      SendAskData(@lReceiveResult,4);
      exit;//如果数据校验错,则向仪器发出错误命令请求重发
    end;
    if not VerifyBNo(inttohex(lBuffer[2],2),inttohex(lBuffer[3],2)) then exit;//仪器编号校验
    lReceiveResult[1]:=_0A;
    lReceiveResult[2]:=strtoint('$'+copy(Fullstr(CommBNo,'0',4),1,2));
    lReceiveResult[3]:=strtoint('$'+copy(Fullstr(CommBNo,'0',4),3,2));
    lReceiveResult[4]:=CalcVerifyCode(@lReceiveResult,4);
    SendAskData(@lReceiveResult,4);//数据接收成功,请求发下一段数据    OverTimeControl(False,3);//取消超时控制
    viewstring:='';
    for i:=6 to BufferLength-1 do
    begin
      allDataBuff[hasDataCount]:=lBuffer[i];
      hasDataCount:=hasDataCount+1;
      viewstring:=viewstring+inttohex(lBuffer[i],2)+' ';
    end;//将本次接收到的数据写入内存
    pBar.Position:=hasDataCount-1;
  end;  if (uppercase(inttohex(lBuffer[1],2))='08') and (BufferLength=4) then
  begin
    if not dataVerify(lBuffer[BufferLength],CalcVerifycode(@lBuffer,BufferLength)) then exit;
    if not VerifyBNo(inttohex(lBuffer[2],2),inttohex(lBuffer[3],2)) then exit;
    OverTimeControl(False,3);
    pBar.Position:=dataCount;  
    memComm.Lines.Add('数据接收结束!');
    InitialComm;
    ////以下处理接收到的数据
    if _IsDebug=1 then
      AcceptData(@allDataBuff,hasdataCount-1)
    else
    begin
      if not dataProcess(@allDataBuff,hasdataCount-1) then exit;
      try
        DMMain.ConnMain.BeginTrans;
        QTestMain.UpdateBatch;
        QTestDetail.UpdateBatch;
        DMMain.ConnMain.CommitTrans;
      except
        QTestMain.CancelBatch;
        QTestDetail.CancelBatch;
        DMMain.ConnMain.RollbackTrans;
        showmessage('数据接收失败');
      end;
    end;
    SetBtnEnable(True);
    exit;
  end;
end;在收到08命令之前我接收完数据大概要到10分钟,这是否有些太长,有什么办法能使之减少的2分钟左右

解决方案 »

  1.   

    串口本來就是低速接口, >>这是否有些太长,有什么办法能使之减少的2分钟左右
    壓縮你的數據, 先將數據壓縮, 再傳送
      

  2.   

    确实长了点,9600bps每秒最高传输速度为1.2k字节,1分钟应该能搞定,跟踪代码找找什么地方效率低,CommDataReceiveData中应该就是把数据传到全局缓冲,其他的操作用postmessage发个消息在其他地方处理
      

  3.   

    算法似乎看不明白,不过可以加大串口缓冲试试:
    在SPCOMM的源文件中找到:
    INPUTBUFFERSIZE
    然后把其定义的数据改大一点。
      

  4.   

    每次接收22个字节,对这22个字节进行模2+校验,前21个的模2+之和=第22个字的值,则表示接收正确,如果校验不通过,发0B命令,仪器重发刚才的数据.数据校验正确后,再做另一个校验,取第二及第三个字节组成一个字符串,检查信息是否发给本机,如果是发给本机,那么发出一个0A命令,表示数据正确接收,仪器接收到0A命令后,继续发下一段数据.当所有数据发完后,仪器向PC发一个08命令!PC接收到08命令后,对数据进行处理.
      

  5.   

    看看下面的帖子,对你有帮助吗?
    http://search.csdn.net/Expert/topic/2180/2180220.xml?temp=.7964289
      

  6.   

    实际接收的数据为44K左右,每次接收22个字节,对这22个字节进行模2+校验,前21个的模2+之和=第22个字的值,则表示接收正确,如果校验不通过,发0B命令,仪器重发刚才的数据.数据校验正确后,再做另一个校验,取第二及第三个字节组成一个字符串,检查信息是否发给本机,如果是发给本机,那么发出一个0A命令,表示数据正确接收,PC对本次接收到的22个字节进行处理,取其中的第6到第21个字节存入一全局级存中,仪器接收到0A命令后,继续发下一段数据.当所有数据发完后,仪器向PC发一个08命令!PC接收到08命令后,结束通信,对数据进行处理.