大家来帮小弟我分析一下有关问题出在了那里呀!

大家来帮我分析一下问题出在了那里呀!!
想实现高速的串口通信,要求为最小50ms的间隔内能完整的收到外界的数据,然后在TStringGrid控件的某一列上将这帧数据进行显示。可我现在遇到了如下问题就是当我的间隔时间设置小于100ms时(和发送的字节数大小也有关),上位机显示的要求和我所想的就不一样了。
我检测是否接收完成的思路是每将接收到一个新的字节后就设置20ms的计时器间隔,当20ms到达就代表此帧数据已接收完成,不管后续是否还存在数据,因为波特率为115200,所以基本上20ms的时间间隔的话足以接收280多个字节,远远的大于我可能要接收的数据长度,所以理想情况下这种方式应该是没有问题的。
问题是当我每次发送的间隔时间小于100ms时,出现的现象就好像20ms内只接收到了几个数据字节,就去列表中显示了!代码如下,希望有高手解答。
procedure TForm1.SerialRxData(Sender: TObject);
begin
  if ser.DataAvailable Then
  begin
    Inc(OnfirstCharFlag);
    if OnfirstCharFlag = 1 Then
    begin
      checkSerialFinish.Enabled := true;
    end;
    rxbuf[rxbufIndex] := ser.SynSer.RecvByte(0);
    Inc(rxbufIndex);
  end;
end;
// 此时无论是否还存在后续数据,都假设此帧数据已接收完成
procedure TForm1.checkSerialFinishTimer(Sender: TObject);
var
  i : Word;
  dataStream : String;
begin
  dataStream := '';
  checkSerialFinish.Enabled := false;
  OnfirstCharFlag := 0;
  TRxState.rxcnt := TRxState.rxcnt + 1;
  BitBtn1.Caption := IntToStr(TRxState.rxcnt);
  if StringGrid1.RowCount <= TRxState.rxcnt Then
  begin
    StringGrid1.RowCount := StringGrid1.RowCount + 1;
  end;
  for i := 0 To rxbufIndex-1 Do
  begin
    dataStream := dataStream + IntToHex(rxbuf[i],2) + ' ';
  end;
  rxbufIndex := 0;
  StringGrid1.Cells[4,TRxState.rxcnt] := dataStream;
  StringGrid1.Row := TRxState.rxcnt;
end;

------解决方案--------------------
数据接收到,是有时间差的,相当于是一个队列。取出后将数据放在自己的缓存里面,满足多少个字节后,显示的视图中。
个人推荐使用TMemoryStream这个流对象做为缓冲区。当然也可以其他的