|
|
|

NMEA 0183 技能信息

NMEA 0183是一种帆海、海运方面有关于数字信号传递的规范,此规范界说了电子信号所需求的传输协议,传输数据时刻、而且指明晰信息格局需求一个4800bps的串行数据接口。 NMEA 0183的设备运用了一个如下必威现金回扣的串行接口的参数挑选: Baud Rate ...

作者:不知道来历:GIS空间站|2006年07月01日

NMEA 0183是一种帆海、海运方面有关于数字信号传递的规范,此规范界说了电子信号所需求的传输协议,传输数据时刻、而且指明晰信息格局需求一个4800bps的串行数据接口。xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

NMEA 0183的设备运用了一个如下必威现金回扣的串行接口的参数挑选:

 

Baud Rate

4800

Data Bits

8(d7=0)

Parity

None

Stop Bits

One(or more)

 

设备需求有信息源和接纳端,传送端发送数据到另一个NMEA 0183的设备,信息源和接纳端别离用来传送和承受8位ASCII码的数据。

   

信息格局:

NMEA 0183的信息格局一般如下所示,

$aaaaa,df1,df2,....[CR][LF]

一切的信息由$开端,以换行完毕,紧跟着$后的五个字符解说了信息的根本类型,多重的信息之间用逗号离隔。

下面是三种根本的类型:

Ø         信息源

Ø         查询

Ø         特点

 

信息源:

它的规范格局为

$ttsss,df1,df2,....[CR][LF]

在紧随$后的两个字符用来辨认做为信息内容辨认码的后3个字符,信息辨认码界说了保存的数据区,在NMEA 0183规范下,每个类型的数据区的信息内容是契合规范的。

例:

    $HCHDM,238,M[CR][LF]

 

标明“HC”阐明信息源作为一个磁性的罗盘,“HDM” 指明以下是磁性的船首向航向,238是船首向航向的值,M指明船首向航向的值是磁性的。

 

查询内容

查询意味着承受端需求从信息源那里得到一个有规则的内容,例如,咱们能够发一个信息给GPS承受器恳求传送一个DISTANCE-TO-WAYPOINT”的信息,得到呼应后,GPS承受器会发送恳求的内容,直到接到其他恳求。

 

一般格局为:

$ttllQ,sss,[CR][LF]

 

头两个字符做为恳求者的信息源的辨认码,后两个字符作为被查询的设备的信息辨认,最终一个字符阐明这是一个查询信息。紧跟着的字段(sss)包含了三个字的被查询内容的回忆信息,如下

  $CCGPQ,GGA[CR][LF]

阐明“CC”这个设备(计算机)正从 “GP”这个设备(GPS)查询GGA的内容。GPS将每隔一秒传送这个内容,直到有其他查询恳求。

 

特点

    这对厂商来说是一种运用没有在规范下预界说的特别内容的办法。

它一般的格局为

    $PmmmA,df1,df2,...,[CR][LF]

P阐明是特点内容,mmm界说为厂商信息代码,A(A-Z)标明信息类型。

 

 

 

以下是一个详细的比如:

和的通讯,接纳到的数据格局将是下面这样的:

  $GPRMC,204700,A,3403.868,N,11709.432,W,001.9,336.9,170698,013.6,E*6E

  经过这个比如来仔细分析一下其间的各部分的意义。不过请注意,咱们只评论前7个数据。表格指出了这些数据的细节阐明。

表格9.1:GPS手持机的NMEA数据结构

数据

NMEA 0183协议

阐明

$GPRMC

 

GPS引荐的最短数据

204700

UTC_TIME

24小时制的规范时刻,依照小时/分钟/秒的格局

A

A 或许 V

A表明数据“OK”,V表明一个正告

3403.868

LAT

纬度值,准确到小数点前4位,后3位

N

LAT_DIR

N表明北纬,S表明南纬

11709.432

LON

经度值,准确到小数点前5位,后3位

W

LON_DIR

W表明西经,E表明东经

  假如当时没有和取得联系,那么字符串的格局为:

$GPRMC,UTC_TIME,V,...

 

GPS THING

有关NMEA数据的类为

struct CNmeaData

{

       CNmeaData ();

       void ResetData ();

     // Data retrieved from the NMEA sentences.

     double lat;          // Latitude, in degrees (positive=N, negative=S)

     double lon;          // Longitude, in degrees (positive=E, negative=W)

     double altitude;     // Altitude, in feet

     double speed;        // Speed, in knots

     double track;        // Current track, in degrees.

     double magVariation; // Magnetic variation, in degrees.

    double hdop;         // Horizontal dilution of precision.

    int numSats;         // Number of satellites in the sky.

     int UTCYear;         // GPS Date (UTC), year part

     int UTCMonth;        // GPS Date (UTC), month part 

    int UTCDay;          // GPS Date (UTC), day part

     int UTCHour;         // GPS Time (UTC), hour part.

     int UTCMinute;       // GPS Time (UTC), minute part 

     int UTCSecond;       // GPS Time (UTC), second part

     CSatData satData[MAX_SATS];

     // Quality of last fix:

    // 0 = invalid, 1 = GPS fix, 2 = DGPS fix.

     GPS_FIX_QUALITY lastFixQuality;

     // Validity of data parsed.

     bool isValidLat;          // Latitude

     bool isValidLon;          // Longitude

     bool isValidAltitude;     // Altitude

     bool isValidSpeed;        // Speed

     bool isValidDate;         // Date

     bool isValidTime;         // Time

     bool isValidTrack;        // Track

     bool isValidMagVariation; // Magnetic variation

     bool isValidHdop;         // Horizontal dilution of precision

     bool isValidSatData;      // Satellite data

 

     // Has a valid coordinate ever been sent over the serial port?

     bool hasCoordEverBeenValid;

};

 

class CNmeaParser

{

     public:

            CNmeaParser ();

            SENTENCE_STATUS ParseSentence (const char* sentence);

            void GetData (CNmeaData& data) const;

            void ResetData () {m_data.ResetData ();}

 

     private:

            bool ParseDegrees (double& degrees, const char* degString) const;

            bool ParseDate (int& year, int& month, int& day,

                   const char* dateString) const;

            bool ParseTime (int& hour, int& minute, int& second,

                   const char* timeString) const;

            void ParseAndValidateAltitude    (const char* field, const char unit);

            void ParseAndValidateDate        (const char* field);

            void ParseAndValidateFixQuality  (const char* field);

            void ParseAndValidateLat         (const char* field, const char hem);

            void ParseAndValidateLon         (const char* field, const char hem);

            void ParseAndValidateHdop        (const char* field);

            void ParseAndValidateSpeed       (const char* field);

            void ParseAndValidateMagVariation(const char* field,

                   const char direction);

            void ParseAndValidateTime  (const char* field);

            void ParseAndValidateTrack (const char* field);

 

            void ParseGGA (const char* sentence);

            void ParseGLL (const char* sentence);

            void ParseRMC (const char* sentence);

            void ParseGSV (const char* sentence);

 

            bool GetNextField (char* data, const char* sentence,

                   uint& currentPosition) const;

            bool IsValidSentenceType (const char* sentence) const;

            bool IsCorrectChecksum (const char* sentence) const;

 

            CNmeaData m_data;

            // Needed for parsing the GSV sentence.

            int m_lastSentenceNumber;// Which sentence number was the last one?

            int m_numSentences;      // Number of sentences to process.

            int m_numSatsExpected;   // Number of satellites expected to parse.

            int m_numSatsLeft;       // Number of satellites left to parse.

            int m_satArrayPos;       // Array position of the next sat entry.            

            CSatData m_tempSatData[MAX_SATS];

};

 

 

class CNmeaSerial

{

     public:

            CNmeaSerial ();

            CNmeaSerial (HWND hMsgWnd, DWORD timeout);

            ~CNmeaSerial ();

            SERIAL_RESULT_TYPE CloseConnection ();

            SERIAL_RESULT_TYPE OpenConnection ();

            SERIAL_RESULT_TYPE OpenConnection (uint8 comPort, uint32 baudRate,

                   uint8 dataBits, SETPARITY parity, STOPBITS stopBits);

            SERIAL_RESULT_TYPE GetData (CNmeaData& data) const;

            SERIAL_RESULT_TYPE GetSettings (uint8& comPort, uint32& baudRate,

                   uint8& dataBits, SETPARITY& parity, STOPBITS& stopBits) const;

            unsigned long GetThreadHandle () const {return m_hThread;}

            BOOL IsConnected () const {return m_isConnected;}

 

     private:

            SERIAL_RESULT_TYPE InitThread  ();

            BOOL KillThread ();

            BOOL LockData () const;

            void SetDefaults ();

            BOOL UnlockData () const;

           

            // The member function that parses the sentences; this function runs

            // in another thread.

            static void ProcessSentences (void* currentObject);

            uint8     m_comPort;

            uint32    m_baudRate;

            uint8     m_dataBits;

            SETPARITY m_parity;

            STOPBITS  m_stopBits;

            BOOL      m_isConnected;

            DWORD     m_timeout;

            unsigned long m_hThread;

            HANDLE m_hPort;

            HANDLE m_hMutex;

            DWORD  m_threadId;

            CNmeaParser m_parser;

            // Window that will receive the parsing messages.

            HWND m_hMsgWnd;

            // If this value is set to TRUE, the thread that parses the sentences

            // will terminate itself.

            BOOL m_terminateThread;

};

上一篇:Palm 串行通讯GPS数据读取的完成

下一篇:VC++完成GPS全球定位系统定位数据的提取