Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi String auf mehrere Teilstrings durchsuchen (https://www.delphipraxis.net/84982-string-auf-mehrere-teilstrings-durchsuchen.html)

hirnstroem 24. Jan 2007 09:50


String auf mehrere Teilstrings durchsuchen
 
'loha Folks,

über das OnRxChar Ereignis der CPort Library werden alle an einem bestimmten virtuellen COM-Port eintreffenden Daten in einen Buffer eingelesen. Nun ist es so, dass nicht jede Mitteilung alleine ankommt, im Buffer des COM-Ports können auch mehrere Mitteilungen abgelegt sein. Die Mitteilungen selbst sehen auch nicht immer gleich aus (die Länge variiert). Ich müsste nun einen Weg finden, die Mitteilungen im Buffer des COM-Ports einzeln herauszufiltern und in einen eigenen Buffer zu legen.

Der InputString wird mit den Daten aus dem Buffer des COM-Ports gefüllt:

Delphi-Quellcode:
procedure TIWServerController.ComPortRxChar(Sender: TObject; Count: Integer);
var
  InputString: String;
  StartPos, EndPos: Integer;
begin
  ComPort.ReadStr(InputString, Count); <- hier wird eingelesen
Der InputString kann z.B. folgendermassen aussehen...

InputString 'T0000000127070'#$D'T0280000284664121850BE01C7'#$D 'T0000000127272'#$D'T0000000127070'#$D'T0000000127 272'#$D

...oder aber so...

InputString 'T0280000284664121850BE01C7'#$D

Nun ist mir nicht ganz klar wie die einzelnen Mitteilungen aus dem String extrahiert werden können, ob man dazu ausschliesslich mit Pos und PosEx arbeiten kann, oder ob es einen einfachen Weg gibt den ich nicht sehe.

Grüsse
hirnstroem

hirnstroem 24. Jan 2007 10:29

Re: String auf mehrere Teilstrings durchsuchen
 
So scheint es zu funktionieren:

Delphi-Quellcode:
procedure TIWServerController.ComPortRxChar(Sender: TObject; Count: Integer);
var
  InputBuffer, InputString: String;
  i, StartPos, EndPos: Integer;
begin
  ComPort.ReadStr(InputBuffer, Count);
  Trim(InputBuffer); // deletes control characters
  if (Pos('T', InputBuffer) <> 0) and (Length(InputBuffer) > 10)then
  begin
    while Pos('T', InputBuffer) <> 0 do
    begin
      StartPos := Pos('T', InputBuffer) + 1;
      EndPos := PosEx('T', InputBuffer, StartPos) - 1;
      if EndPos <= 0 then
      begin
        InputString := Copy(InputBuffer, StartPos, 25); // no more messages - copy from T to the max. message length
        CANCommunication.WriteDataIntoBuffer(InputString);
        Exit;
      end
      else
      begin
        InputString := Copy(InputBuffer, StartPos, EndPos - StartPos); // copy the message to the InputString
        InputBuffer := Copy(InputBuffer, EndPos , Length(InputBuffer) - StartPos); // delete the message from InputBuffer
        CANCommunication.WriteDataIntoBuffer(InputString);
      end;
    end;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz