大家来帮小弟我分析一下有关问题出在了那里呀!
大家来帮我分析一下问题出在了那里呀!!
想实现高速的串口通信,要求为最小50ms的间隔内能完整的收到外界的数据,然后在TStringGrid控件的某一列上将这帧数据进行显示。可我现在遇到了如下问题就是当我的间隔时间设置小于100ms时(和发送的字节数大小也有关),上位机显示的要求和我所想的就不一样了。
我检测是否接收完成的思路是每将接收到一个新的字节后就设置20ms的计时器间隔,当20ms到达就代表此帧数据已接收完成,不管后续是否还存在数据,因为波特率为115200,所以基本上20ms的时间间隔的话足以接收280多个字节,远远的大于我可能要接收的数据长度,所以理想情况下这种方式应该是没有问题的。
问题是当我每次发送的间隔时间小于100ms时,出现的现象就好像20ms内只接收到了几个数据字节,就去列表中显示了!代码如下,希望有高手解答。
------解决方案--------------------
数据接收到,是有时间差的,相当于是一个队列。取出后将数据放在自己的缓存里面,满足多少个字节后,显示的视图中。
个人推荐使用TMemoryStream这个流对象做为缓冲区。当然也可以其他的
想实现高速的串口通信,要求为最小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这个流对象做为缓冲区。当然也可以其他的