NMEA碼資料解析 C語言

2021-09-27 05:59:48 字數 4753 閱讀 6137

#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...