2011-12-14 11 views
5

私はopensourceを探しています。Robust Delphi NMEAパーサーをお探しですか?

重要な任務要件を満たすことができればうれしいです(私は冗談を言っています!Win32システムでは達成できないと思います)。

これまでは、基本的なウィンドウAPI(NMEA 0183)を使用してシリアルポート経由で手首のGPS(Garmin Foretrex 101)を基本的に操作していました。

また、航空モデルGPS(Garmin Gpsmap 196)との実験的なシリアル通信を処理するためのオープンソースのVCLコンポーネントについても検討しました。

ありがとうございました。

+3

オープンソースではありませんが、まだ良いですが、[ZylSoftのNMEA GPSコンポーネント](http://www.zylsoft.com/)です。 –

+0

@ LU RD:ありがとう、ZylSolfは多くの優れたコンポーネントを書いています。 – menjaraz

+0

何かが達成できないと思うなら、なぜそれを求めていますか?明らかにあなたが望むものが達成可能であることは、達成できない理由がないことです。 –

答えて

4

私は、オープンソースTComPortパッケージからTComPortTComDataPacketを使用して終了。


COMポートの設定:

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 

ComDataPacket設定:使用されるタイプの

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

抜粋

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; 

ComDataPacketPacketイベントハンドラは:

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; 

NMEA処理は、イベントハンドラで行われました。

+1

これは私の発見(Delphi 2010でテスト済み)を共有するためのものです。ありがとう。 – menjaraz