zoukankan      html  css  js  c++  java
  • NMEA0183标准语句

    一、 NMEA0183标准语句
    1、 Global Positioning System Fix Data(GGA)GPS定位信息
    $GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh<CR><LF>
    <1> UTC时间,hhmmss(时分秒)格式
    <2> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
    <3> 纬度半球N(北半球)或S(南半球)
    <4> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
    <5> 经度半球E(东经)或W(西经)
    <6> GPS状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算
    <7> 正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)
    <8> HDOP水平精度因子(0.5~99.9)
    <9> 海拔高度(-9999.9~99999.9)
    <10> 地球椭球面相对大地水准面的高度
    <11> 差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
    <12> 差分站ID号0000~1023(前面的0也将被传输,如果不是差分定位将为空)
    2、 GPS DOP and Active Satellites(GSA)当前卫星信息
    $GPGSA,<1>,<2>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<3>,<4>,<5>,<6>*hh<CR><LF>
    <1> 模式,M=手动,A=自动
    <2> 定位类型,1=没有定位,2=2D定位,3=3D定位
    <3> PRN码(伪随机噪声码),正在用于解算位置的卫星号(01~32,前面的0也将被传输)。
    <4> PDOP位置精度因子(0.5~99.9)
    <5> HDOP水平精度因子(0.5~99.9)
    <6> VDOP垂直精度因子(0.5~99.9)
    3、 GPS Satellites in View(GSV)可见卫星信息
    $GPGSV,<1>,<2>,<3>,<4>,<5>,<6>,<7>,…<4>,<5>,<6>,<7>*hh<CR><LF>
    <1> GSV语句的总数
    <2> 本句GSV的编号
    <3> 可见卫星的总数(00~12,前面的0也将被传输)
    <4> PRN码(伪随机噪声码)(01~32,前面的0也将被传输)
    <5> 卫星仰角(00~90度,前面的0也将被传输)
    <6> 卫星方位角(000~359度,前面的0也将被传输)
    <7> 信噪比(00~99dB,没有跟踪到卫星时为空,前面的0也将被传输)
    注:<4>,<5>,<6>,<7>信息将按照每颗卫星进行循环显示,每条GSV语句最多可以显示4颗卫星的信息。其他卫星信息将在下一序列的NMEA0183语句中输出。
    4、 Recommended Minimum Specific GPS/TRANSIT Data(RMC)推荐定位信息
    $GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh<CR><LF>
    <1> UTC时间,hhmmss(时分秒)格式
    <2> 定位状态,A=有效定位,V=无效定位
    <3> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
    <4> 纬度半球N(北半球)或S(南半球)
    <5> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
    <6> 经度半球E(东经)或W(西经)
    <7> 地面速率(000.0~999.9节,前面的0也将被传输)
    <8> 地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
    <9> UTC日期,ddmmyy(日月年)格式
    <10> 磁偏角(000.0~180.0度,前面的0也将被传输)
    <11> 磁偏角方向,E(东)或W(西)
    <12> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
    5、 Track Made Good and Ground Speed(VTG)地面速度信息
    $GPVTG,<1>,T,<2>,M,<3>,N,<4>,K,<5>*hh<CR><LF>
    <1> 以真北为参考基准的地面航向(000~359度,前面的0也将被传输)
    <2> 以磁北为参考基准的地面航向(000~359度,前面的0也将被传输)
    <3> 地面速率(000.0~999.9节,前面的0也将被传输)
    <4> 地面速率(0000.0~1851.8公里/小时,前面的0也将被传输)
    <5> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
    6、 Geographic Position(GLL)定位地理信息
    $GPGLL,<1>,<2>,<3>,<4>,<5>,<6>,<7>*hh<CR><LF>
    <1> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
    <2> 纬度半球N(北半球)或S(南半球)
    <3> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
    <4> 经度半球E(东经)或W(西经)
    <5> UTC时间,hhmmss(时分秒)格式
    <6> 定位状态,A=有效定位,V=无效定位
    <7> 模式指示(仅NMEA0183 3.00版本输出,A=自主定位,D=差分,E=估算,N=数据无效)
    二、 GARMIN定义的语句
    7、 Estimated Error Information(PGRME)估计误差信息
    $PGRME,<1>,M,<2>,M,<3>,M*hh<CR><LF>
    <1> HPE(水平估计误差),0.0~999.9米
    <2> VPE(垂直估计误差),0.0~999.9米
    <3> EPE(位置估计误差),0.0~999.9米
    8、 GPS Fix Data Sentence(PGRMF)GPS定位信息
    $PGRMF,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>,<13>,<14>,<15>*hh<CR><LF>
    <1> GPS周数(0~1023)
    <2> GPS秒数(0~604799)
    <3> UTC日期,ddmmyy(日月年)格式
    <4> UTC时间,hhmmss(时分秒)格式
    <5> GPS跳秒数
    <6> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
    <7> 纬度半球N(北半球)或S(南半球)
    <8> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
    <9> 经度半球E(东经)或W(西经)
    <10> 模式,M=手动,A=自动
    <11> 定位类型,0=没有定位,1=2D定位,2=3D定位
    <12> 地面速率(0~1851公里/小时)
    <13> 地面航向(000~359度,以真北为参考基准)
    <14> PDOP位置精度因子(0~9,四舍五入取整)
    <15> TDOP时间精度因子(0~9,四舍五入取整)
    9、 Map Datum(PGRMM)坐标系统信息
    $PGRMM,<1>*hh<CR><LF>
    <1> 当前使用的坐标系名称(数据长度可变,如“WGS 84”)
    注:该信息在与MapSource进行实时连接的时候使用。
    10、 Sensor Status Information(PGRMT)工作状态信息
    $PGRMT,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>*hh<CR><LF>
    <1> 产品型号和软件版本(数据长度可变,如“GPS 15L/15H VER 2.05”)
    <2> ROM校验测试,P=通过,F=失败
    <3> 接收机不连续故障,P=通过,F=失败
    <4> 存储的数据,R=保持,L=丢失
    <5> 时钟的信息,R=保持,L=丢失
    <6> 振荡器不连续漂移,P=通过,F=检测到过度漂移
    <7> 数据不连续采集,C=正在采集,如果没有采集则为空
    <8> GPS接收机温度,单位为摄氏度
    <9> GPS接收机配置数据,R=保持,L=丢失
    注:本语句每分钟发送一次,与所选择的波特率无关。
    11、 3D velocity Information(PGRMV)三维速度信息
    $PGRMV,<1>,<2>,<3>*hh<CR><LF>
    <1> 东向速度,514.4~514.4米/秒
    <2> 北向速度,514.4~514.4米/秒
    <3> 上向速度,999.9~9999.9米/秒
    12、 DGPS Beacon Information(PGRMB)信标差分信息
    $PGRMB,<1>,<2>,<3>,<4>,<5>,K,<6>,<7>,<8>*hh<CR><LF>
    <1> 信标站频率(0.0,283.5~325.0kHz,间隔为0.5kHz)
    <2> 信标比特率(0,25,50,100或200bps)
    <3> SNR信标信号信噪比(0~31)
    <4> 信标数据质量(0~100)
    <5> 与信标站的距离,单位为公里
    <6> 信标接收机的通讯状态,0=检查接线,1=无信号,2=正在调谐,3=正在接收,4=正在扫描
    <7> 差分源,R=RTCM,W=WAAS,N=非差分定位
    <8> 差分状态,A=自动,W=仅为WAAS,R=仅为RTCM,N=不接收差分信号

    三、TEXT文本格式说明:

        区域描述:              长度:    注释:
        ----------------------- ------- ------------------------
        句头起始符              1       始终为 '@'
        ----------------------- ------- ------------------------
       /年                      2       UTC年的最后两位数字
      | ----------------------- ------- ------------------------
      | 月                      2       UTC月, "01".."12"
    T | ----------------------- ------- ------------------------
    i | 日                      2       UTC日, "01".."31"
    m | ----------------------- ------- ------------------------
    e | 时                      2       UTC时, "00".."23"
      | ----------------------- ------- ------------------------
      | 分                      2       UTC分, "00".."59"
      | ----------------------- ------- ------------------------
       \秒                      2       UTC秒, "00".."59"
        ----------------------- ------- ------------------------
       /纬度半球                1       'N' 或 'S'
      | ----------------------- ------- ------------------------
      | 纬度坐标                7       WGS84坐标系统,坐标格式ddmmmmm,
      |                                 在第4位数字后省略了一个小数点。
      | ----------------------- ------- ------------------------
      | 经度半球                1       'E' 或 'W'
      | ----------------------- ------- ------------------------
      | 经度坐标                8       WGS84坐标系统,坐标格式dddmmmmm,
    P |                                 在第5位数字后省略了一个小数点。
    o | ----------------------- ------- ------------------------
    s | 定位状态                1       'd' 2维差分定位
    i |                                 'D' 3维差分定位
    t |                                 'g' 2维定位
    i |                                 'G' 3维定位
    o |                                 'S' 模拟状态
    n |                                 '_' 无效
      | ----------------------- ------- ------------------------
      | 水平定位误差            3       单位为“米”
      | ----------------------- ------- ------------------------
      | 高度符号                1       '+' 或 '-'
      | ----------------------- ------- ------------------------
       \高度                    5       海拔高,单位为“米”
        ----------------------- ------- ------------------------
       /东/西 速度方向          1       'E' 或 'W'
      | ----------------------- ------- ------------------------
      | 东/西速度               4       单位是“米/秒”,在第三位后省略了一个小数点,
      |                                 ("1234" = 123.4 m/s)
    V | ----------------------- ------- ------------------------
    e | 南/北 速度方向          1       'S' 或 'N'
    l |
    o | ----------------------- ------- ------------------------
    c | 南/北 速度              4       单位是“米/秒”,在第三位后省略了一个小数点,
    i |                                 ("1234" = 123.4 m/s)
    t | ----------------------- ------- ------------------------
    y | 垂直速度方向            1       'U' (上) 或 'D' (下)
      | ----------------------- ------- ------------------------
      | 垂直速度                4       单位是“米/秒”,在第二位后省略了一个小数点,
       \                                ("1234" = 12.34 m/s)
        ----------------------- ------- ------------------------
        句尾结束符              2        回车, '0x0D', 和换行'0x0A'
        ----------------------- ------- ------------------------

    如果某字段的数值没有达到所定义的长度,将在前面添加0。

    任何无效的数字将以下划线来代替。



    有关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;

    };


  • 相关阅读:
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 回形取数
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    Java实现 蓝桥杯VIP 基础练习 报时助手
    block的是发送信号的线程,又不是处理槽函数的线程
  • 原文地址:https://www.cnblogs.com/wangzihao/p/1985311.html
Copyright © 2011-2022 走看看