2011-12-14 12 views
5

Sto cercando parser NMEA opensource Delphi di grado di produzione.Alla ricerca di un parser Delphi NMEA robusto

Va bene se può soddisfare i requisiti di missione critici (sto scherzando! Credo che non è raggiungibile utilizzando un sistema Win32).

Finora, ho giocato con l'interfaccia di base di un GPS da polso (Garmin Foretrex 101) tramite porta seriale utilizzando l'API di base di Windows (NMEA 0183).

Ho anche esplorato un componente VCL opensource per gestire la comunicazione seriale sperimentale con un GPS modello aeronautico (Garmin Gpsmap 196).

Grazie.

+3

Non open source, ma comunque buono, è il [componenti NMEA GPS di ZylSoft] (http://www.zylsoft.com/). –

+0

@ LU RD: Grazie, ZylSolf ha scritto molti componenti eccezionali. – menjaraz

+0

Se pensi che qualcosa non sia raggiungibile allora perché lo chiedi? Chiaramente quello che vuoi è raggiungibile non c'è una ragione per cui non possa essere raggiungibile. –

risposta

4

I finire con TComPort e TComDataPacket dal pacchetto source TComPort. impostazione


ComPort:

object ComPort: TComPort 
    BaudRate = br4800 
    Port = 'COM1' 
    Parity.Bits = prNone 
    StopBits = sbTwoStopBits 
    DataBits = dbEight 
    Events = [evRxChar, evTxEmpty, evRxFlag, evRing, evBreak, evCTS, evDSR, evError, evRLSD, evRx80Full] 
    FlowControl.OutCTSFlow = False 
    FlowControl.OutDSRFlow = False 
    FlowControl.ControlDTR = dtrDisable 
    FlowControl.ControlRTS = rtsDisable 
    FlowControl.XonXoffOut = False 
    FlowControl.XonXoffIn = False 
    SyncMethod = smWindowSync 
    OnAfterOpen = ComPortAfterOpen 
    OnAfterClose = ComPortAfterClose 
    Left = 904 
    Top = 192 
    end 

impostazioni ComDataPacket:

object ComDataPacket: TComDataPacket 
    ComPort = ComPort 
    StartString = '$' 
    StopString = '*' 
    OnPacket = ComDataPacketPacket 
    Left = 808 
    Top = 240 
    end 

Estratto del tipo usato

type 
    // NMEA 0185's messages used 
    TMsgGP = (
    msgGP, // Unknown message 
    msgGPGGA, // Global Positioning System Fix Data 
    msgGPGLL, // Geographic position, Latitude and Longitude 
    msgGPGSV, // Satellites in view 
    msgGPRMA, // Recommended minimum specific GPS/Transit data Loran C 
    msgGPRMC, // Recommended minimum specific GPS/Transit data 
    msgGPZDA // Date and time 
    ); 

    // Satellite properties 
    TSatellite = record 
    Identification: ShortInt; 
    Elevation: 0..90; 
    Azimut: Smallint; 
    SignLevel: Smallint; 
    end; 
    // Array of satellites referenced 
    TSatellites = array[1..MAX_SATS] of TSatellite; 

    // GPS status informations 
    TGPSDatas = record 
    Latitude: Double; 
    Longitude: Double; 
    HeightAboveSea: Double; 
    Speed: Double; 
    UTCTime: TDateTime; 
    Valid: Boolean; 
    NbrSats: Shortint; 
    NbrSatsUsed: Shortint; 
    end; 

gestore ComDataPacketPacket evento:

procedure TForm1.ComDataPacketPacket(Sender: TObject; const Str: string); 
var 
    Resultat: TStringList; 
    MsgCorrect, TypeMsg: string; 
    i: Integer; 
begin 
    Resultat := TStringList.Create; 
    try 

    // Split the message into different parts. 
    MsgCorrect := AnsiReplaceStr('$'+Str, ',,', ' , , '); 
    Resultat.Text := AnsiReplaceStr(LeftStr(MsgCorrect, Length(MsgCorrect) - 1), ',', #13#10); 

    // Get the message type 
    TypeMsg := AnsiMidStr(Resultat[0], 4, 3); 

    case IndexMsgGP(TypeMsg) of 
     msgGPGGA: 
     begin 
     end; 
     msgGPGLL: 
     begin 
     end; 
     msgGPGSV: 
     begin 
      // If there are satellites referenced in the frame 
      if Resultat.Count < 4 then 
      FGPSDatas.NbrSats := 0 
      else 
      FGPSDatas.NbrSats := StrToInteger(Resultat[3]); 

      if Resultat[2] = '1' then 
      begin 
      FSatRef := 0; 

      // Initiate satellites values 
      for i := 1 to 12 do 
       with FSatellites[i] do 
       begin 
       Identification := 0; 
       Elevation := 0; 
       Azimut := 0; 
       SignLevel := 0; 
       end; 
      end; 

      i := 4; 

      // For each referenced satellites 
      while (i + 4) <= (Resultat.Count) do 
      begin 
      with FSatellites[FSatRef + 1] do 
      begin 
       Identification := StrToInteger(Resultat[i]); 
       Elevation := StrToInteger(Resultat[i + 1]); 
       Azimut := StrToInteger(Resultat[i + 2]); 
       if Resultat[i + 3] <> '' then 
       SignLevel := StrToInteger(Resultat[i + 3]) 
       else 
       SignLevel := 0; 
      end; 
      Inc(i, 4); 
      Inc(FSatRef); 
      end; 
     end; 
     msgGPRMA: 
     begin 
     end; 
     msgGPRMC: 
     begin 
     end; 
     msgGPZDA: 
     begin 
     end; 
     else 
    end; 
    finally 
    Resultat.Free; 
    end; 
end; 

elaborazione NMEA ha avuto luogo nel gestore di eventi.

+1

Questo è per condividere i miei risultati (testato con Delphi 2010). Grazie. – menjaraz