![]() |
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:
Der InputString kann z.B. folgendermassen aussehen...
procedure TIWServerController.ComPortRxChar(Sender: TObject; Count: Integer);
var InputString: String; StartPos, EndPos: Integer; begin ComPort.ReadStr(InputString, Count); <- hier wird eingelesen 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 |
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 15:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz