Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   daten von gps-maus über Com-Port auslesen (https://www.delphipraxis.net/33652-daten-von-gps-maus-ueber-com-port-auslesen.html)

btbe 10. Nov 2004 17:44


daten von gps-maus über Com-Port auslesen
 
Hi, bin ein relativer Delphi Noob, habe mir in Delphi ne kleine Oberfläche für meinen PC im Auto erstellt und möchte jetzt Daten von meiner GPS-Maus auslesenund z.B. die Geschwindigkeit etc. auslesen... bin jetzt hier seit etlichen stunden am rumsuchen und hab es inzwischen geschafft die daten übers hyperterminal auszulesen und hab auch schon eine beschreibung zum entsprechenden protokoll gefunden.

Hyperterminal Auszug:
Zitat:

$GPGGA,173722.000,5004.8731,N,00835.7397,E,0,00,,, M,,M,,*49
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,3,1,12,22,14,158,,19,06,272,,28,53,336,,15, 57,207,38*7A
$GPGSV,3,2,12,03,36,282,36,29,03,055,,16,65,234,,1 4,20,170,*78
$GPGSV,3,3,12,13,12,306,,10,01,027,,06,23,094,,20, 49,249,*71
$GPRMC,173722.000,V,5004.8731,N,00835.7397,E,,,101 104,,*1B
So mein problem ist jetzt, ich will diese zeilen (je nach anzahl der sateliten zw. 3 und 11 (erste Zeile fängt mit $GPGGA und die letzte mit $GPRMC an)) einmal pro sekunde auslesen und theoretisch alles was zwischen den Kommas steht in variablen bzw. arrays schreiben, so dass ich dann damit arbeiten kann.

ich hoffe es gibt da eine einfache möglichkeit, die auch ein delphi noob wie ich versteht!

Schon mal danke!

mfg
btbe

PS: Wenn es was hilft der GPS Empfänger ist per usb angeschlossen und läuft uber den "usb-to-serial" treiber an COM5!

Ultimator 10. Nov 2004 17:53

Re: daten von gps-maus über Com-Port auslesen
 
Naja, du kannst ja die Daten in eine datei speichern, nach Kommata suchen und dann jeden Kommawert in eine Variable speichern.

Da ganze eben in einem Timer mit Interval 1000.

Aus deiner fragestellung denke ich zu erkennen, dass du weißt, wie man an die Daten vom Com-Port rankommt. :-)
Sollte dies nicht der Fall sein, hilft bestimmt eine DP-Suche nach Comport oder Com-Port ;-)


PS: Bist du schon begrüßt worden? wenn nicht, dann: Herzlich willkommen :dp: :mrgreen:

Bernhard Geyer 10. Nov 2004 17:56

Re: daten von gps-maus über Com-Port auslesen
 
Für die serielle Kommunikation würde ich Async Pro nehmen.

Für den Rest solltest Du dir eine vernünftige Struktur überlegen:

Z.B. eine Komponete TGPSEventer entwickeln.
Verbindbar mit AsyncPro-Komponente und bei Empfang eine mit lesbareren Parametern versehenen Event auslösen.
In Formular wird dann nur die Geschwindigkeitsberechnung durchgeführt.

btbe 10. Nov 2004 18:20

Re: daten von gps-maus über Com-Port auslesen
 
@ultimator ne, keine ahnung wie ich an die daten rankomme, das ist eigentliche problem! die daten dannin variablen schreiben würd ich wahrscheinlich mit viel rumprobieren hinbekommen, was ich mir erhoffe ist ne anleitung in der form
"Du brauchst diese komponente oder package oder was auch immer, das installierst du so udn so und den com port öffnest du so die daten kannst du dann so in ein label, datei, etc. schreiben....) ich weiß eben nicht was ich dafür brauche oder wie ich es anwende, mein delphi wissen beschränkt sich so ziehmlich auf das was ich in der schule im info lk gemacht habe (funktionsgraphen zeichnen etc...

thnx

CReber 10. Nov 2004 19:54

Re: daten von gps-maus über Com-Port auslesen
 
Kurze unrelevante Frage... Wie / Wo hast du deinen Rechner im Auto eingebaut? Und was für eine GPS-Maus hast du? Interessiert mich ernsthaft ! :)

Salomon 10. Nov 2004 20:11

Re: daten von gps-maus über Com-Port auslesen
 
Hallo,
noch jemand der ein Computer im Auto hat :-) Ich habe ebenfalls ein CarPuter mit 7" TFT TouchScreen.
Ich hatte ebenfalls mal vor für meine Programmoberfläche eine GPS funktion einzubauen. Leider habe ich aus Zeitgründen schon lange nicht mehr daran weitergemacht. Unten findest du meinen bislang geschriebenen Quelltext. Der ist noch sehr unsauber geschrieben, und die Interprtation funktioniert auch nicht. Aber zum einlesen der daten vom COM Port reicht es. Ist denke ich ein guter Anfang. Wenn du weiter kommst, wäre es schön wenn du dein Quellcode hier postest.

Delphi-Quellcode:
//################################################################
//###################### COM Port Functionen #####################
//################################################################

function TForm1.opencom(comport : string): boolean;
begin
hport:= CreateFile(PChar(comport),GENERIC_READ + GENERIC_WRITE,0,nil,OPEN_EXISTING,0,0);

GetCommState(hport,dcb);

dcb.BaudRate := strtoint(form2.Baudrate.text); // Bautrate
dcb.ByteSize := strtoint(form2.Data.text);    // 8 Bits je Byte
dcb.Parity  := strtoint(form2.Parity.Text);  // kein Paritäts Bit NOPARITY
dcb.StopBits := strtoint(form2.Stopbit.Text); // ein Stopp Bit ONESTOPBIT
dcb.wReserved:= 0;
// In Buffer // Out Buffer
if SetupComm(hPort, 800, 8)
then
begin
result := true;
//Statusbar.Panels.Text := ('erfolgreich initialisiert...');
end
else
begin
result := false;
//Statusbar.Panels.Text :=('konnte NICHT initialisiert!');
end;
SetCommState(hport,dcb);
end;

function inport(var Str: string): Integer;
var
  BytesTrans, nRead: DWORD;
  Buffer          : String;
  i, j            : Integer;
  temp, temp2      : string;

begin
  Str := '';
  SetLength(Buffer,1);
  ReadFile(hport,PChar(Buffer)^, 1, nRead, nil);
  while nRead > 0 do
  begin
    temp := temp + PChar(Buffer);
    ReadFile(hport,PChar(Buffer)^, 1, nRead, nil);
  end;
  //Remove the end token.
  BytesTrans := Length(temp);
  SetLength(str,BytesTrans-2);
  for i:=0 to BytesTrans-2 do
  begin
    str[i] := temp[i];
  end;
  Result := BytesTrans;
end;


procedure closecom;
var result : LongBool;
begin
CloseHandle(hport);
end;


//###########################################################
//################ NMEA Interpreter #########################
//###########################################################
procedure TForm1.Timer1Timer(Sender: TObject);
Var received_data: String;
 i : integer;
 temp : String;
begin

inport(received_data);

memo1.Text := memo1.Text + CRLF + received_data;
{
temp := '';

for i := 1 to length(received_data) do
begin
temp := temp + received_data[i];
//if copy(temp,i,1) = CRLF then
 //begin
    memo1.Lines.Add(temp);
  //  temp := '';
 //end;
end;
     
 
     for j := 0 to length(temp2) do
      begin
       if copy(temp[j],1,1) = CRLF then
         str := temp2;
      end;
memo1.Lines.Add(received_data);}


end;
Mfg
Salomon

btbe 10. Nov 2004 20:53

Re: daten von gps-maus über Com-Port auslesen
 
Liste der Anhänge anzeigen (Anzahl: 1)
@hOnkibOnk: PC: 800Mhz Duron
256MB DDR Ram
2GB CompactFlash Karte als bootplatte (wegen stößen, etc.)
externe Platte 80GB (wird angeschlossen falls benötigt für mp3s etc.)
Haicom HI-202E GPS-Maus
GeForce4 MX440
am tv out 7" TFT
zu weihnachten kommt n touchscreen rein deshalb progge ich auch die oberfläche (windows ist nich grad Fingerfreundlich!)
PC is im Kofferraum in nem selbstgebauten Gehäuse
Geplant ist langfristig noch ne relaissteuerung über den pc für endstufe, etc. und eine verbindung zwischen pc und boardcomputer via obd-II Schnittstelle.... aber das is noch zukunftsmusik....
Wenn ihr bilder von euren systemen habt, schickt mir doch mal ein paar so als anregungen (webmaster@btbe-design.de), wer interesse hat dem kann ich auch bilder schicken! Ich hab mal ein Bild von der Software angehängt, soweit wie sie jetzt ist. Wer interesse hat dem kann ich sobald ich mit der gpsintegration ferig bin das programm schicken!

So aber um mal zum thema zurückzukommen:

Hab jetzt mal async pro installiert und habe es geschafft mithilfe eines codes den ich hier im Forum gefunden hab die einzelnen chars auszugeben. Hier der Code:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, OoMisc, AdPort, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    ComPort: TApdComPort;
    Label1: TLabel;
    Button1: TButton;
    procedure ComPortTriggerAvail(CP: TObject; Count: Word);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Data: String;
  I: Integer;

implementation

{$R *.dfm}

procedure TForm1.ComPortTriggerAvail(CP: TObject; Count: Word);
begin
  { OnTriggerAvail; Read the data }
  for I:= 0 to Count -1 do
     Data := ComPort.GetChar;
Label1.Caption := Label1.Caption + Data;
end;



end.
Jetzt müssen diese in arrays geschrieben werden (pro zeile 1 array) z.B. GPGGA[1] = 173722.000, GPGGA[2] = 5004.8731, GPGGA[3] = N,...... Gebraucht werden die zeilen GPGGA, GPGSA und GPRMC und dann kommt das ganze wieder neu vom gps und nun soll wieder von vorne angefangen werden und die alten werte überschrieben werden...
Hat da jemand ne saubere Lösung?

CReber 10. Nov 2004 22:04

Re: daten von gps-maus über Com-Port auslesen
 
SOWAS nenne ich sexy ;)

btbe 10. Nov 2004 22:52

Re: daten von gps-maus über Com-Port auslesen
 
hm.... hab hier mal n ansatz, um die einzelnen elemente einer zeile in das entsprechende array zu schreiben...
Delphi-Quellcode:
procedure TForm1.ComPortTriggerAvail(CP: TObject; Count: Word);
begin
  { OnTriggerAvail; Read the data }
 for I:= 0 to Count -1 do
     Data := ComPort.GetChar;
   Label2.Caption := Label2.Caption + Data;
 if Data = '*' then
  begin
   Memo1.Text := Label2.Caption;
   Label2.Caption := '';
  if pos('GPGGA', Label2.Caption) > 0 then
      begin
          while x < length(Label2.Caption) do
             begin
              if Label2.Caption[x] = ',' then
                begin
                 y := y + 1;
                 x := x + 1;
                end
               else
                begin
                 GPGGA[y] := Label2.Caption[x];
                end;
             end;
      end;

 Label1.Caption := Label1.Caption + Data;
 end;
end;
komme aber nicht weiter, da wenn ich ein array ausgeben will, kommt diese Fehlermeldung:
Zitat:

Project Project1.exe raised expection class EAccesViolation with message 'Access violation at adress 004741C4 in module 'Project.exe'. Read of adress 00000001'. Process stopped. Use Step or Run to continue.
Also wenn jemand ne Ahnung hat wie ich hier weiter komme oder einen besseren Ansatz hat bitte so schnell wie möglich melden!

thnx
btbe

Steve 11. Nov 2004 06:59

Re: daten von gps-maus über Com-Port auslesen
 
Hi,

Delphi-Quellcode:
Label2.Caption := '';
if pos('GPGGA', Label2.Caption) > 0 then
'' enthält niemals 'GPGGA' ;) Das erklärt zwar nich unbedingt die AV, is mir nur beim Überfliegen so aufgefallen ;)

edit: setz ma nen Breakpoint (F5) und prüf, wo/wann die AV auftritt (F7,F8 )

Gruß
Stephan :dance:


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:05 Uhr.
Seite 1 von 2  1 2      

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