delphi 7中的串行通信未完全接收

delphi 7中的串行通信未完全接收,delphi,serial-port,arduino,Delphi,Serial Port,Arduino,我有一个从arduino接收传感器值的Delphi代码。Delphi接收的值是4个字符长的字符串。例如0.04;0,32; 0,28等,但有时未完全收到该值。只有1个字符显示为4;33;2等,当其应为0.04时;0,32; 0,28. 这是我在Delphi 7中编写的代码: procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer); var Str: String; tegangan: real; begin D

我有一个从arduino接收传感器值的Delphi代码。Delphi接收的值是4个字符长的字符串。例如0.04;0,32; 0,28等,但有时未完全收到该值。只有1个字符显示为4;33;2等,当其应为0.04时;0,32; 0,28. 这是我在Delphi 7中编写的代码:

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  Str: String;
  tegangan: real;
begin
  DecimalSeparator:='.';
  sleep(25);
  ComPort1.ReadStr(Str, 4);
if Str <> '' then
begin
  Edit1.Text:=Str;
  tegangan:=strtofloat(Edit1.Text);
  x := x + 1;
  with chart1 do
    with series1 do
      addxy(x,tegangan);
      Adotable1.Open;
      AdoTable1.Append;
      AdoTable1.FieldByName('Arus').AsString:=Edit1.Text;
      AdoTable1.FieldByName('Waktu').AsString:=formatdatetime('dd/mm/yyyy'+'hh:nn:ss',now);
      AdoTable1.Post;
    end;
  end;
end;
过程TForm1.ComPort1RxChar(发送方:TObject;计数:整数);
变量
Str:字符串;
特甘甘:真的;
开始
小数分隔符:='';
睡眠(25);
成分1.ReadStr(Str,4);
如果Str“”那么
开始
Edit1.Text:=Str;
tegangan:=strtofloat(Edit1.Text);
x:=x+1;
用chart1做什么
一系列的
addxy(x,tegangan);
表1.开放式;
表1.追加;
AdoTable1.FieldByName('Arus').AsString:=Edit1.Text;
AdoTable1.FieldByName('Waktu')。AsString:=formatdatetime('dd/mm/yyyy'+'hh:nn:ss',now);
表1.员额;
结束;
结束;
结束;

您假设
ReadStr()
返回您请求的所有内容。
OnRxChar
事件的
Count
参数告诉您实际可用的字节数。如果数字始终为4个字符,请尝试类似的方式(类似于您评论的中提供的答案):


您可能在设备完成发送之前阅读。如果您需要,如果您格式化代码并提出问题,您可能会得到更多帮助。
var
  Buffer: AnsiString;

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  Str: AnsiString;
  tegangan : Real;
begin
  ComPort1.ReadStr(Str, Count);
  Buffer := Buffer + Str;

  while Length(Buffer) >= 4 do
  begin
    Str := Copy(Buffer, 1, 4);
    Delete(Buffer, 1, 4);

    Edit1.Text := Str;

    DecimalSeparator := '.';
    tegangan := StrToFloat(Str);
    Inc(x);

    chart1.series1.addxy(x, tegangan);

    AdoTable1.Open;
    AdoTable1.Append;
    AdoTable1.FieldByName('Arus').AsString := Str;
    AdoTable1.FieldByName('Waktu').AsString := FormatDateTime('dd/mm/yyyyhh:nn:ss', Now);
    AdoTable1.Post;
  end;
end;