delphi 7中的串行通信未完全接收
我有一个从arduino接收传感器值的Delphi代码。Delphi接收的值是4个字符长的字符串。例如0.04;0,32; 0,28等,但有时未完全收到该值。只有1个字符显示为4;33;2等,当其应为0.04时;0,32; 0,28. 这是我在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
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;