Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi COM Port Ausgabe teilen (https://www.delphipraxis.net/157134-com-port-ausgabe-teilen.html)

einballimwasser 30. Dez 2010 22:33

COM Port Ausgabe teilen
 
Hallo,

ich versuche momentan ein Gerät mit dem PC zu verbinden. Das funktioniert über die serielle Schnittstelle und das gar nicht mal so schlecht. Ich nutze die TComport Library bzw Routinen um die serielle Schnittstelle auszulesen. Mit dem TComTerminal bekomme ich auch eine schöne Ausgabe der Messages. Jetzt gibt es einen Standard, der Messages in dieser Fom vorsieht:

Zitat:

$GPGGA,135843.000,0000.0000,N,00000.0000,E,0,00,0. 0,0.0,M,0.0,M,,0000*65
$GPGSA,A,1,,,,,,,,,,,,,0.0,0.0,0.0*30
$GPRMC,135843.000,V,0000.0000,N,00000.0000,E,000.0 ,000.0,280606,,,N*74
$GPVTG,000.0,T,,M,000.0,N,000.0,K,N*02
Was ich nun aber benötige ist der erste Teil, der $GPGGA String. Ich suche nun eine Möglichkeit, diesen aus der Message zu extrahieren und später weiter zu verarbeiten.
Mir fällt leider keine Möglichkeit ein, wie cih das bewerkstelligen könnte, ohne eine Endlosschleife zu produzieren. Die Hilfe zur Lib gibt mir leider keine Ahnhaltspunkte, wie cih das realisieren könnte. Das einzige Event, das mir vllt nützlich sein könnte ist eines, das immer aufgerufen wird, wenn ein Char in den Buffer geschrieben wird. Doch auch da benötige ich eine Endlosschleife, um den String zu identifizieren.
Von Delphi habe ich nur das Basiswissen, was man mir in der Schule angedreht hat.

Ist mir noch zu helfen?

implementation 30. Dez 2010 22:47

AW: COM Port Ausgabe teilen
 
Wie möchtest du die Daten denn haben?
Von
Code:
$GPGGA,135843.000,0000.0000,N,00000.0000,E,0,00,0. 0,0.0,M,0.0,M,,0000*65
nach
Code:
$GPGGA
135843.000
0000.0000
N
00000.0000
E
0
00
0. 0
0.0
M
0.0
M

0000*65
So richtig? Die Kommata als Trennzeichen?
Oder habe ich dich falsch verstanden?

einballimwasser 30. Dez 2010 23:00

AW: COM Port Ausgabe teilen
 
Danke für die Antwort.

Die Daten kommen als $... Strings an. Ich möchte diesen Stream nun teilen in den $GPGGA String (der ja durch ein Line Forward beendet werden sollte?), der als Variable abgelegt wird. Der Rest ist dann einfach für mich.

Mein konkretes Problem besteht darin, eine effektive Methode zu finden, diesen Stream, der sekündlich ankommt (alle $GP Messages meine ich damit) zu trennen und den $GPGGA String herauszuschneiden. Dabei möchte ich auf eine Endlosschleife verzichten und suche daher einen Algorithmus (bzw eine Möglichkeit), der mir eine sichere Extraktion dieses $GPGGA Strings ermöglicht. Konkret:

Diesen Stream:
Zitat:

$GPGGA,135843.000,0000.0000,N,00000.0000,E,0,00,0. 0,0.0,M,0.0,M,,0000*65\LF$GPGSA,A,1,,,,,,,,,,,,,0. 0,0.0,0.0*30\LF$GPRMC,135843.000,V,0000.0000,N,000 00.0000,E,000.0 ,000.0,280606,,,N*74\LF$GPVTG,000.0,T,,M,000.0,N,0 00.0,K,N*02\LF.......
muss ich so trennen, das ich die $GPGGA Messages als einzelnen String bekomme. Das ginge auf jeden Fall, wenn ich die Schnittstelle andauernd pollen würde. Das möchte ich aber nicht wirklich. \LF ist das Line Feed Kontrollzeichen der seriellen Schnittstelle.

LargoD 30. Dez 2010 23:17

AW: COM Port Ausgabe teilen
 
TComPort bietet eine Paketerkennung, d. h. Du definierst Start- und Stop-String und dann wird das OnPaket Event ausgelöst, wenn so ein Paket angekommen ist. Dann ist es sehr leicht, die gewünschten Teile mit Stringfunktionen heraus zu schneiden.
Gruß
Erich

Bummi 30. Dez 2010 23:24

AW: COM Port Ausgabe teilen
 
In OnRecieve alles in einen Puffer schreiben, schauen ob eine kompletter $GPGAA da ist, wenn ja diesen in einen GPGAA-Puffer schreiben, den Puffer bis ans Ende des Strings leeren, und eine von Dir zuwählende Ereignisbehandlungsroutine aufrufen.

einballimwasser 31. Dez 2010 00:11

AW: COM Port Ausgabe teilen
 
Hallo,

ich habe die ganze Zeit nicht gesucht, wonach ich wissen wollte. Nun klappt es ohne Probleme :)


Danke euch!


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:27 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