2011-12-14 8 views
5

के लिए खोज रहे हैं मैं उत्पादन ग्रेड के ओपनसोर्स डेल्फी एनएमईए पार्सर की तलाश में हूं।रोबस्ट डेल्फी एनएमईए पार्सर

यह ठीक होगा अगर यह महत्वपूर्ण मिशन आवश्यकता को पूरा कर सकता है (मैं मजाक कर रहा हूं! मुझे विश्वास है कि यह Win32 सिस्टम का उपयोग करने योग्य नहीं है)।

अब तक, मैंने मूल विंडोज एपीआई (एनएमईए 0183) का उपयोग कर धारावाहिक बंदरगाह के माध्यम से एक कलाई जीपीएस (गार्मिन फोरटेरेक्स 101) के मूल इंटरफेसिंग के साथ खेला है।

मैंने एक विमानन मॉडल जीपीएस (गार्मिन जीपीएसमैप 1 9 6) के साथ प्रयोगात्मक सीरियल संचार को संभालने के लिए एक ओपनसोर्स वीसीएल घटक भी खोजा है।

धन्यवाद।

+3

खुला स्रोत नहीं है, लेकिन अभी भी अच्छा है, [ZylSoft से [एनएमईए जीपीएस घटक] (http://www.zylsoft.com/) है। –

+0

@ LU आरडी: धन्यवाद, ज़िलसोल्फ ने कई उत्कृष्ट घटक लिखे हैं। – menjaraz

+0

यदि आपको लगता है कि कुछ उपलब्ध नहीं है तो आप इसके लिए क्यों पूछ रहे हैं? स्पष्ट रूप से आप जो चाहते हैं वह प्राप्त करने योग्य है, ऐसा कोई कारण नहीं है जो इसे प्राप्त नहीं किया जा सके। –

उत्तर

4

मैं TComPort और TComDataPacket का उपयोग कर खुला स्रोत TComPort पैकेज से खत्म।


अच्छी तरह पेश आना सेटिंग:

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

यह मेरे निष्कर्षों को साझा करना है (डेल्फी 2010 के साथ परीक्षण)। धन्यवाद। – menjaraz

संबंधित मुद्दे