#include
"nmea.h"
#include
"stdio.h"
#include
"stdarg.h"
#include
"string.h"
#include
"math.h"
//
//bc20 nmea解析
//
//從buf裡面得到第cx個逗號所在的位置
//返回值:0~0xfe,代表逗號所在位置的偏移.
// 0xff,代表不存在第cx個逗號
uint8_t nmea_comma_pos
(uint8_t *buf,uint8_t cx)
return buf-p;
}//m^n函式
//返回值:m^n次方.
uint32_t nmea_pow
(uint8_t m,uint8_t n)
//str轉換為數字,以','或者'*'結束
//buf:數字儲存區
//dx:小數點位數,返回給呼叫函式
//返回值:轉換後的數值
intnmea_str2num
(uint8_t *buf,uint8_t*dx)
//是負數if(
*p==
','||
(*p==
'*')
)break
;//遇到結束了if(
*p==
'.')
//遇到小數點了
elseif(
*p>
'9'||
(*p<
'0')
)//有非法字元
if(mask&
0x01
)flen++
;else ilen++
; p++;}
if(mask&
0x02
)buf++
;//去掉負號
for(i=
0;i)//得到整數部分資料
if(flen>
5)flen=5;
//最多取5位小數
*dx=flen;
//小數點位數
for(i=
0;i)//得到小數部分資料
res=ires*
nmea_pow(10
,flen)
+fres;
if(mask&
0x02
)res=
-res;
return res;
}//分析gpgsv資訊
//gpsx:nmea資訊結構體
//buf:接收到的gps資料緩衝區首位址
void
nmea_gpgsv_analysis
(nmea_msg *gpsx,uint8_t *buf)
p=p1+1;
//切換到下乙個gpgsv資訊}}
//分析gbgsv資訊
//gpsx:nmea資訊結構體
//buf:接收到的gps資料緩衝區首位址
void
nmea_gbgsv_analysis
(nmea_msg *gpsx,uint8_t *buf)
p=p1+1;
//切換到下乙個bdgsv資訊}}
//分析gngga資訊
//gpsx:nmea資訊結構體
//buf:接收到的gps資料緩衝區首位址
void
nmea_gngga_analysis
(nmea_msg *gpsx,uint8_t *buf)
//分析gngsa資訊
//gpsx:nmea資訊結構體
//buf:接收到的gps資料緩衝區首位址
void
nmea_gngsa_analysis
(nmea_msg *gpsx,uint8_t *buf)
posx=
nmea_comma_pos
(p1,15)
;//得到pdop位置精度因子
if(posx!=
0xff
)gpsx->pdop=
nmea_str2num
(p1+posx,
&dx)
; posx=
nmea_comma_pos
(p1,16)
;//得到hdop位置精度因子
if(posx!=
0xff
)gpsx->hdop=
nmea_str2num
(p1+posx,
&dx)
; posx=
nmea_comma_pos
(p1,17)
;//得到vdop位置精度因子
if(posx!=
0xff
)gpsx->vdop=
nmea_str2num
(p1+posx,
&dx);}
//分析gnrmc資訊
//gpsx:nmea資訊結構體
//buf:接收到的gps資料緩衝區首位址
void
nmea_gnrmc_analysis
(nmea_msg *gpsx,uint8_t *buf)
posx=
nmea_comma_pos
(p1,3)
;//得到緯度
if(posx!=
0xff
) posx=
nmea_comma_pos
(p1,4)
;//南緯還是北緯
if(posx!=
0xff
)gpsx->nshemi=
*(p1+posx)
;
posx=
nmea_comma_pos
(p1,5)
;//得到經度
if(posx!=
0xff
) posx=
nmea_comma_pos
(p1,6)
;//東經還是西經
if(posx!=
0xff
)gpsx->ewhemi=
*(p1+posx)
;
posx=
nmea_comma_pos
(p1,9)
;//得到utc日期
if(posx!=
0xff)}
//分析gnvtg資訊
//gpsx:nmea資訊結構體
//buf:接收到的gps資料緩衝區首位址
void
nmea_gnvtg_analysis
(nmea_msg *gpsx,uint8_t *buf)
}//提取nmea-0183資訊
//gpsx:nmea資訊結構體
//buf:接收到的gps資料緩衝區首位址
void
nmea_analysis
(nmea_msg *gpsx,uint8_t *buf)
標頭檔案
#ifndef __nmea_h
#define __nmea_h
#include
"stm32l0xx_hal.h"
//gps nmea-0183協議重要引數結構體定義
//衛星資訊
__packed typedef
struct
nmea_satellitemsg;
//北斗 nmea-0183協議重要引數結構體定義
//衛星資訊
__packed typedef
struct
beidou_nmea_satellitemsg;
//utc時間資訊
__packed typedef
struct
nmea_utc_time;
//nmea 0183 協議解析後資料存放結構體
__packed typedef
struct
nmea_msg;
intnmea_str2num
(uint8_t *buf,uint8_t*dx)
;void
nmea_analysis
(nmea_msg *gpsx,uint8_t *buf)
;void
nmea_gpgsv_analysis
(nmea_msg *gpsx,uint8_t *buf)
;void
nmea_bdgsv_analysis
(nmea_msg *gpsx,uint8_t *buf)
;void
nmea_gngga_analysis
(nmea_msg *gpsx,uint8_t *buf)
;void
nmea_gngsa_analysis
(nmea_msg *gpsx,uint8_t *buf)
;void
nmea_gngsa_analysis
(nmea_msg *gpsx,uint8_t *buf)
;void
nmea_gnrmc_analysis
(nmea_msg *gpsx,uint8_t *buf)
;void
nmea_gnvtg_analysis
(nmea_msg *gpsx,uint8_t *buf)
;#endif
C語言解析MNIST資料集
如下 bmp.h ifndef bmp h define bmp h pragma pack 1 typedef struct tagbitmapfileheader fileheader pragma pack 位圖資料資訊結構 pragma pack 1 typedef struct tagbi...
解析資料幀 c語言編寫
include stdio.h include file fp file fp1 標頭檔案 include int main void n i printf n前導碼 i 0 while a i 解析前導碼 printf n幀定界符 i 0 while a i 幀定界符 i 0 while a i ...
C語言解析json型別資料
首先感謝作者!我使用的是cjson 先看json的資料結構 c中沒有物件,所以json資料是採用鍊錶儲存的 c 如下 1 typedef struct cjson cjson 比如你有乙個json資料如下 1 10 那麼你可以 1 講字串解析成json結構體。c 1 cjson root cjson...