字符串操作很慢

0 delphi serial-port arduino delphi-7

我使用Delphi 7制作了一个接口软件,用于从arduino中获取数据.Arduino有3个传感器.Arduino将发送16个字符作为传感器值.例子是:

 m  0  0  .  0  1  0  0  .  0   2   0   0   .   0   3
[1][2][3][4][5][6][7][8][9][10][11][12][13][14][15][16]

[1] Flag for Start value
[2],[7],[12] are sensors status (0=disconnected, 1=connected)
[3][4][5][6] first sensor value
[8][9][10][11] second sensor value
[13][14][15][16] third sensor value
Run Code Online (Sandbox Code Playgroud)

我将arduino中的字符串值分配给名为Edit1的editText.之后我使用字符串"Copy"逐个获取传感器值.然后,传感器值将在标签中逐个显示.但标签需要很长时间才能改变价值.第一次,我认为它是由标签导致的更新缓慢.然后我用editText更改标签,但工作方式相同(仍然需要很长时间来更新值).那么有没有办法让这件事变得更快?或者字符串操作有问题?

这是我的代码:

procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
var
  Str,Buffer,Rstatus,Sstatus,Tstatus: String;
  arus : real;
  i : integer;
begin
  DecimalSeparator:='.';   
  ComPort1.ReadStr(Str, 1);
  begin
    Buffer:=Buffer + Str;
    Edit1.Text:=Edit1.Text+Str;
    if Str='m' then
    edit1.Text:='';
      if Length(Edit1.Text) >=15 then
      begin
        Rstatus:=copy(Edit1.Text,1,1);
        Sstatus:=copy(Edit1.Text,6,1);
        Tstatus:=copy(Edit1.Text,11,1);
        if Rstatus='0' then
          begin
          Label1.Caption:='0 A';
          Label1.Update
          end
        else
          begin
          Label1.Caption:=copy(Edit1.Text,2,4)+' A';
          Label1.Update
          end;
        if Sstatus='0' then
          begin
          Label2.Caption:='0 A';
          Label2.Update
          end
        else
          begin
          Label2.Caption:=copy(Edit1.Text,7,4)+' A';
          Label2.Update;
          end;
        if Tstatus='0' then
          begin
          Label3.Caption:='0 A';
          Label3.Update
          end
        else
          begin
          Label3.Caption:=copy(Edit1.Text,12,4)+' A';
          Label3.Update;
          end;
      end;
    end;
end;
Run Code Online (Sandbox Code Playgroud)

Tom*_*erg 5

该过程的标题有一个重要参数,Count:

  procedure TForm1.ComPort1RxChar(Sender: TObject; Count: Integer);
Run Code Online (Sandbox Code Playgroud)

它会告诉您已收到多少个字符并准备好供您阅读.通常,低通信速度只有一个,但有时可能有两个或更多.如果你只读了1个字符

  ComPort1.ReadStr(Str, 1);
Run Code Online (Sandbox Code Playgroud)

剩余的字符将丢失,或者在下一个字符OnRxChar发生之前不会被读取.对于消息中的最后一个字符,在下一条消息触发事件之前不会发生这种情况.这可以解释为什么你认为这个过程太慢了.治愈方法是阅读Count字符而不是只读一个字符.

但似乎有一个错误,你根本无法接受完整的测量.我们来看看代码:

Edit1.text := Edit1.text + Str;
if Str = 'm' then
  Edit1.text := '';
if Length(Edit1.text) >= 15 then
Run Code Online (Sandbox Code Playgroud)

您的目的是等待m标志,并在收到它时清除Edit1.Text.没关系.然后你收到并收集剩下的消息,直到你在Edit1.Text中有15个字符,这也没关系.但是,你用一个'2'?覆盖收到的消息?

begin
  Edit1.text := '2';
Run Code Online (Sandbox Code Playgroud)

当然,消息解析的其余部分将失败.

如果您纠正了上述两个错误,我相信您的代码可能确实有效.

评论后编辑

替换这些行

Edit1.text := Edit1.text + Str;
if Str = 'm' then
  Edit1.text := '';
Run Code Online (Sandbox Code Playgroud)

for i := 1 to Length(Str) do
if Str[i] = 'm' then
  Edit1.text := ''
else
  Edit1.Text := Edit1.Text + Str[i];
Run Code Online (Sandbox Code Playgroud)

然后你也可以删除Buffer因为你没有使用它以及多余的begin .. end;一对.