gps在linux中串口设置,linux下串口gps應用

linux串口gps使用總結

一、Gps數據格式標准(nmea0183)http://en.wikipedia.org/wiki/NMEA

這次只要獲取經緯度信息,所有主要針對下面2個Gps命令

(1)位置信息(GGA)

$GPGGA、<1>、<2>、<3>、<4>、<5>、<6>、<7>、<8>、<9>、M, <11>、<12>*hh

<1>UTC時間,hh mm ss格式(定位它的)

<2>經度dd mm mmmm 格式(非0)

<3>經度方向 N或S

<4>緯度ddd mm mmmm 格式(非0)

<5>緯度方向E或W

<6>GPS狀態批示0—未定位 1—無差分定位信息 2—帶差分定位信息

<7>使用衛星號(00~08)

<8>精度百分比

<9>海平面高度

<10>大地隨球面相對海平面的高度

<11>差分GPS信息

<12>差分站ID號 0000-123

(2)最簡特性(RMC)

$GPRMC、<1>、<2>、<3>、<4>、<5>、<6>、<7>、<8>、<9>、<10>、<11>、*hh

<1>定位時UTC時間hhmmss 格式

<2>狀態A=定位V=導航

<3>經度ddmm.mmm 格式

<4>經度方向N 或S

<5>緯度dddmm.mmmm

<6>緯度方向E或W

<7>速率

<8>方位敬愛(二維方向指向,相當於二維羅盤)

<9>當前UTC日期ddmmyy 格式

<10>太陽方位

<11>太陽方向

二、nmealib庫的使用

(1) 獲取nmealib源碼,並交叉編譯成.so文件

獲取源碼后,修改源碼結構如下:

a. 在源碼目錄新建include目錄,將源碼中所有.h文件移到該include目錄中,

b. 編寫Makefile文件,文件內容如下:

# 制作的目標文件名libnmeagps.so

TARGET = libnmeagps.so

# 包含所有頭文件

INCLUDE_FILE = context.h generate.h parse.h parser.h gtime.h

INCLUDE_FILE += tok.h units.h gmath.h nmea.h sentence.h info.h generator.h config.h

# 設置交叉編譯工具

COMPILER_PATH = arm-linux-

CC = $(COMPILER_PATH)gcc

CXX = $(COMPILER_PATH)g++

LD = $(COMPILER_PATH)ld

AR = $(COMPILER_PATH)ar

LIBRARY = ./lib/

INCLUDE_DIR =./include/

FLAGS = -Wall -O3 -s-I. -I$(INCLUDE_DIR)

ifdef S3C2440

FLAGS +=-DPLAT_S3C2440

else ifdef TI6446

FLAGS +=-DPLAT_TI6446

else

endif

OBJS = $(patsubst%.c,%.o, $(wildcard*.c))

%.o:%.c

@$(CC)-c $(FLAGS) $

all:$(OBJS)

@$(CC)-shared -Wall-fPIC -s $(OBJS)-o $(TARGET)

@cp $(TARGET) $(LIBRARY) 1>/dev/null

@cp $(INCLUDE_FILE) $(INCLUDE_DIR) 1>/dev/nul

update:

@cp -a $(INCLUDE_FILE) $(INCLUDE_DIR) 1>/dev/null

clean:

rm $(TARGET)*.o -f執行make命令,編譯生成動態庫文件libnmeagps.so

(2) 移植nmealib庫到項目中

在項目源碼目錄中新建nmea_gps目錄,將(1)中編譯生成的libnmeagps.so和所有頭文件拷貝到nmea_gps

目錄中,在需要應用庫借口的代碼中增加相應頭文件的聲明即可。

項目Makefile增加下面內容:

NMEA_LIB=-L./nmea_gps/ -lnmeagps

$(CXX) -o $@  $^  $(NMEA_LIB)

(3) 測試/* nmea_lib測試程序*/

void trace(const char*str, int str_size)

{

printf("Trace: ");

write(1, str, str_size);

printf("\n");

}

void error(const char*str, int str_size)

{

printf("Error: ");

write(1, str, str_size);

printf("\n");

}

int main()

{

nmeaINFO info;

nmeaPARSER parser;

FILE *file;

char buff[2048];

int size, it= 0;

nmeaPOS dpos;

file = fopen("gpslog.txt","rb");

if(!file)

return -1;

nmea_property()->trace_func= &trace;

nmea_property()->error_func= &error;

nmea_zero_INFO(&info);

nmea_parser_init(&parser);

/*

while(1)

{

*/

while(!feof(file))

{

size =(int)fread(&buff[0], 1, 100, file);

nmea_parse(&parser,&buff[0], size,&info);

nmea_info2pos(&info,&dpos);

/* 獲取 lat經度,lon緯度,sig信號指標,fix操作模式*/

printf("%03d, Lat: %f, Lon: %f, Sig: %d, Fix: %d\n", it++, info.lat, info.lon, info.sig, info.fix);

}

fseek(file, 0, SEEK_SET);

/*

}

*/

nmea_parser_destroy(&parser);

fclose(file);

return 0;

}

三、應用

1. 打開串口設備

hGpshandle = open("/dev/ttyS2", O_RDWR);

2. 設置串口波特率

set_serial_param(hGpshandle, 9600, 8, 1, 'n', 0);

3. 循環從串口讀取數據,數據大小1024kb

readlen = read(hGpshandle, tmp_buf, 1500);

4. 數據取滿,解析gps數據

pThis->DoParserGpsData(pArg);

5. 從解析結果判斷gps信號質量

/* 0 = Invalid; 1 = Fix; 2 = Differential, 3 = Sensitive */

if(info.sig == GPS_SIG_OK)

6. 經緯度數據單位轉換

/* 經緯度轉換為位置點 */

nmea_info2pos(&info, &pos[it]);

7. gps校時

pThis->DoCheckTimeByGps(info);

8. 計算前后2個gps坐標點之間距離

dist = nmea_distance(&pos[it - 1], &pos[it]);

9. 將gps坐標信息,距離寫入記錄文件

pThis->DoWriteGpsInfoToFile(g_sCurGpsInfoPath, info, dist);

四、gps經緯度數據單位相關

gps數據單位是一個需要注意的問題。

(以下內容摘自網絡)

1. GPS串口讀取的數據格式:

GPS 串口讀出的是 DDMM.MMMM格式

一般上位機是 DD.DDDDDD°或 DD°MM'SS" 格式, 這兩種都可以在 GE 里直接輸入

舉例說明: 3147.8749 (示例,經緯度一樣) 格式為 DDMM.MMMM

轉換成度:

1. 度的部分直接就是31,

2.剩下的 MM.MMMM/60=度, 所以 47.8749/60=0.797915

則 轉換成度是 31.797915°

轉換成度分秒:

1. 同樣,度的部分直接就是31,

2. 分直接是整數部分 47

3. 秒則是 后面的 0.MMMM*60. 例子中為: 0.8749*60=52.494

4. 則度分秒即是 31°47'52.494"

精確到 0.001"

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值