GPS定位

$GPGGA,hhmmss.ssss,ddmm.mmmm,a,dddmm.mmmm,a,x,xx,x.x,x.x,M,,M,x.x,xxxx*CS
$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F

0.$GPGGA 語句ID 表明該語句爲Global Positioning System Fix Data(GGA)GPS定位信息
1.UTC時間,hhmmss.ssss,時分秒格式    092204.999
2.緯度 ddmm.mmmm,度分格式(前導位數不足則補0) 4250.5589
3.緯度 N 北緯  S 南緯                          S
4.經度 dddmm.mmmm,度分格式(前導位數不足則補0) 14718.5084
5.經度 經度 E 東經  W 西經                     E
6.GPS狀態,0=未定位 1=非差分定位 2=差分定位 3=無效PPS 6=正在估算  1
7.正在使用的衛星數量(00--12)                          04
8.HDOP水平精度因子(0.5--99.9)                         24.4
  PDOP 圖形強度因子
  HDOP 平面強度因子
  VDOP 高程強度因子
  HDOP是描述水平座標精度的誤差程度,值爲緯度和經度誤差平方和的開根號值,所以最準確的時候

HDOP近似於1,一般來說大於6,就表示誤差比較大。
  PDOP是指位置精度強弱度(0.5--99.9);爲緯度、經度和高程等誤差平方和的開根號值,所以Pdop的

平方 =Hdop 的平方 +Vdop 的平方。具體含義:歸因於衛星的幾何分佈,天空中衛星分佈程度越好,定

位精度越高(數值越小精度越高)。
9.地球橢球面相對大地水準面的高度    19.7
10.海拔高度單位  M
11.WGS-84水準劃分
12.WGS-84水準劃分單位
13.差分時間(從最近一次接收到差分信號開始的秒數,如果不是差分定位將爲空)
14.差分站ID號0000 - 1023(前導位數不足則補0,如果不是差分定位將爲空)
15.校驗位  *1F

$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A

0.$GPGSA 語句ID,表明該語句爲GPS DOP and Active Satellites(GSA)當前衛星信息
1.定位模式  A=自動2D/3D  M=手動2D/3D
2.定位類型  1=未定義  2=2D定位  3=3D定位
3.PRN碼(僞隨機噪聲碼) 第1信道正在使用的衛星PRN碼編號(00)
   12條信道
15.PDOP綜合位置精度因子(0.5 - 99.9)
16.HDOP水平精度因子(0.5 - 99.9)
17.VDOP垂直精度因子(0.5 - 99.9)
18.校驗值

$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,13,45*70

0.$GPGSV,語句ID,表明該語句爲GPS Satellites in View(GSV)可見衛星信息
1.本次GSV語句的總數目(1--3)
2.本條GSV語句是本次GSV語句的第幾條(1--3)
3.當前可見衛星總數(00--12)
4.PRN碼(01-32)
5.衛星仰角(00--90)
6.衛星方位角(000--359)
7.信噪比(00--99)dbHz
8.PRN碼(01-32)
9.衛星仰角(00--90)
10.衛星方位角(000--359)
11.信噪比(00--99)dbHz
12.PRN碼(01-32)
13.衛星仰角(00--90)
14.衛星方位角(000--359)
15.信噪比(00--99)dbHz
16.校驗值

$GPRMC,024813.640,A,3158.4608,N,11848.3737,E,10.05,324.27,150706,,,A*50

0.$GPRMC,語句ID,表明該語句爲Recommended Minimum Specific GPS/TRANSIT Data(RMC)推薦最小定

位信息
1. hhmmss.sss
2. A=定義  V=未定義
3. 緯度 DDMM.MMMM
4. N 北  S 南
5. 經度 DDDMM.MMMM
6. E 東  W 西
7. 速度 節 Knots
8. 方位角 度
9. DDMMYY
10.磁偏角 (000 -- 180)
11.磁偏角方向 E=東 W=西

16.效驗碼

 
$GPVTG,89.68,T,,M,0.00,N,0.0,K*5F

0.$GPVTG,語句ID,表明該語句爲Track Made Good and Ground Speed(VTG)地面速度信息
1.運動角度 000--359
2.T=正北參照系
3.運動角度 000-359
4.M = 磁北參照系
5.水平運動速度(0.00)
6.N =節
7.水平運動速度
8.K=公里/時
9.效驗值


$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D
0.$GPGLL,語句ID,表明該語句爲Geographic Position(GLL)地理定位信息
1.緯度ddmm.mmmm,度分格式(前導位數不足則補0)
2.緯度N(北緯)或S(南緯)
3.經度dddmm.mmmm,度分格式(前導位數不足則補0)
4.經度E(東經)或W(西經)
5.UTC時間,hhmmss.sss格式
6.狀態,A=定位,V=未定位
7.校驗值

 typedef enum
{
 BS_INVAL = 0, ///無效狀態
 BS_IDLE,  ///空閒狀態
 BS_WRITE,  ///寫狀態
 BS_READ   ///讀狀態
}BUFFER_STATE;

typedef struct
{
 BYTE *pBuff;
 DWORD dwLen; 
}BufferStruct;

typedef struct
{
 BYTE btHour;    //
 BYTE btMinute;     //
 BYTE btSecond;     //
 BYTE btDay;     //
 BYTE btMonth;    //
 WORD wYear;     //
 BYTE btDataValid;   // 1 = last valid, 2 = 2D valid, 3 = 3D valid, 4 = cellid2gps, 0 = navigation rx warning
 double dbLatitude;   // current latitude
 double dbLongitude;   // current longitude
 double dbAltitude;   // Altitude: mean-sea-level (geoid) meters
 double dbAccuracy;   // 水平精度
 double dbSpeed;    // speed over ground, knots
 double dbCourse;   // course over ground, degrees true
}CkGPSDataStruct;
/// 設置gps數據有效回調
typedef void (*cgps_set_gpsdata_cb)(const CkGPSDataStruct *p_gpsdata);
/// 設置原始GPS數據回調
typedef void (*cgps_set_raw_gps_cb)(const GPSDataStruct *p_rawgps);

typedef struct
{
   short sh_gps_count;                ///使用gps的功能的數量
   BOOL  bt_open;                     ///是否已經打開GPS
   BUFFER_STATE  ns_buffer_state;     ///串口數據緩存的狀態
   BYTE  b_buffer_valid_cnt;          ///緩存連續無效的次數
   BufferStruct gpsdate;              ///GPS數據
   char *fp;                         ///存放gps數據的文件
   U32 u32_tick;                      ///gps有效的tick
   cgps_set_gpsdata_cb  set_gpsdata_cb[MAX_GPSM_MODULE_SIZE]; ///設置gps數據有效回調
   cgps_set_raw_gps_cb  set_raw_gps_cb[MAX_GPSM_MODULE_SIZE]; ///設置原始GPS數據回調
}GPSParseStruct;

static GPSParserStruct gGPSParser;

void cgps_init(void)
{
   CKGPSDataStruct *p_ckGPSData = &gGPSParser.gpsdata;
   static char szGPSDataFile[MAX_PATH] = {0};
  
   cfs_get_full_path(szGPSDataFile,"GData.dat");
  
   memset(&gGPSParser,0,sizeof(GPSParserStruct));
  
   gGPSParser.fp = szGPSDataFile;
#ifdef __CKING_WRITE_GPSDATA_CYCLICAL__
      cgps_read_gpsdata(p_ckGPSData);
   StopTimer(U16_GPS_WRITE_FILE_TIMER);
   StartTimer(U16_GPS_WRITE_FILE_TIMER,
     CK_GPS_WRITE_FILE_INTERVAL,
     cgps_write_gpsdata);
#endif
}

BOOL cgps_open(void)
{
   BOOL bRet = TRUE;
  
   if(gGPSParser.sh_gps_count <= 0)
   {
      bRet = GPS_Open();
   if(bRet)
   {
#ifndef __CKING_SYNCHRONIZATION_ANALYSIS__
     StopTimer(U16_GPS_DATA_RECV_TIMER);
     StartTimer(U16_GPS_DATA_RECV_TIMER,
       CK_GPS_DATA_RECV_SHORT_INTERVAL,
       cgps_parse_uart_buffer);
#endif
     gGPSParser.bt_open = TRUE;
     gGPSParser.sh_gps_count = 1;
   }
   }
   else
   {
   gGPSParser.sh_gps_count++;
   }
   return bRet;
}

void cgps_close(void)
{
   if(gGPSParser.sh_gps_count <= 1)
   {
      stopTimer(U16_GPS_DATA_RECV_TIMER);
   GPS_Close();
   gGPSParser.bt_open = FALSE;
   gGPSParser.sh_gps_count = 0;
   }
   else
   {
      gGPSParser.sh_gps_count--;
   }
}

///解析串口數據
static void cgps_parse_uart_buffer(void)
{
   GPSDataStruct *pGpsData = NULL;
   ///判斷緩存是否爲寫狀態,如果是就等待
   if(gGPSParser.ns_buffer_state == BS_WRITE)
   {
        StopTimer(U16_GPS_DATA_RECV_TIMER);
  StartTimer(U16_GPS_DATA_RECV_TIMER,
       CK_GPS_DATA_RECV_SHORT_INTERVAL,
       cgps_parse_uart_buffer);
  return;
   }
  
   if(gGPSParser.ns_buffer_state == BS_INVAL)
   {
        gGPSParser.b_buffer_valid_cnt ++;
  if(gGPSParser.b_buffer_valid_cnt >= MAX_UART_BUFFER_INVAL_TIMES)
  {
      gGPSParser.b_buffer_valid_cnt = 0;
   nmea_parser_init();
  }
  
  StopTimer(U16_GPS_DATA_RECV_TIMER);
  StartTimer(U16_GPS_DATA_RECV_TIMER,
       CK_GPS_DATA_RECV_SHORT_INTERVAL,
       cgps_parse_uart_buffer);
  return;
   }
   gGPSParser.ns_buffer_state = BS_READ;
  
   pGpsData = nmea_parse_buffer(gGPSParser.data.pBuff,gGPSParser.data.dwLen);
  
   gGPSParser.ns_buffer_state = BS_INVAL;
  
   StopTimer(U16_GPS_DATA_RECV_TIMER);
   StartTimer(U16_GPS_DATA_RECV_TIMER,
     CK_GPS_DATA_RECV_SHORT_INTERVAL,
     cgps_parse_uart_buffer);
   if(pGpsData != NULL)
   {
       cgps_excute_raw_gps_cb(pGpsData);
    cgps_parse_gpsdata(pGpsData);
   }
     
      
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章