linux下串口gps應(yīng)用
嵌入式系統(tǒng)是計(jì)算機(jī)技術(shù)的一種重要應(yīng)用形式。從概念上講,嵌入式系統(tǒng)并不是近來才出現(xiàn)的產(chǎn)品,但隨著計(jì)算技術(shù)和通信技術(shù)的迅速發(fā)展以及Internet的廣泛應(yīng)用,嵌入式系統(tǒng)卻從來沒有象現(xiàn)在這樣風(fēng)靡過。接下來是小編為大家收集的linux下串口gps應(yīng)用,希望能幫到大家。
linux下串口gps應(yīng)用
一、Gps數(shù)據(jù)格式標(biāo)準(zhǔn)(nmea0183)
http://en.wikipedia.org/wiki/NMEA
這次只要獲取經(jīng)緯度信息,所有主要針對(duì)下面2個(gè)Gps命令
(1)位置信息(GGA)
$GPGGA、<1>、<2>、<3>、<4>、<5>、<6>、<7>、<8>、<9>、M, <11>、<12>*hh
<1>UTC時(shí)間,hh mm ss格式(定位它的)
<2>經(jīng)度dd mm mmmm 格式(非0)
<3>經(jīng)度方向 N或S
<4>緯度ddd mm mmmm 格式(非0)
<5>緯度方向E或W
<6>GPS狀態(tài)批示0—未定位 1—無差分定位信息 2—帶差分定位信息
<7>使用衛(wèi)星號(hào)(00~08)
<8>精度百分比
<9>海平面高度
<10>大地隨球面相對(duì)海平面的高度
<11>差分GPS信息
<12>差分站ID號(hào) 0000-123
(2)最簡特性(RMC)
$GPRMC、<1>、<2>、<3>、<4>、<5>、<6>、<7>、<8>、<9>、<10>、<11>、*hh
<1>定位時(shí)UTC時(shí)間hhmmss 格式
<2>狀態(tài)A=定位V=導(dǎo)航
<3>經(jīng)度ddmm.mmm 格式
<4>經(jīng)度方向N 或S
<5>緯度dddmm.mmmm
<6>緯度方向E或W
<7>速率
<8>方位敬愛(二維方向指向,相當(dāng)于二維羅盤)
<9>當(dāng)前UTC日期ddmmyy 格式
<10>太陽方位
<11>太陽方向
二、nmealib庫的使用
(1) 獲取nmealib源碼,并交叉編譯成.so文件
nmealib 最新版本為0.53,可在http://sourceforge.net/projects/nmea/下載獲取到
獲取源碼后,修改源碼結(jié)構(gòu)如下:
a. 在源碼目錄新建include目錄,將源碼中所有.h文件移到該include目錄中,
b. 編寫Makefile文件,文件內(nèi)容如下:
# 制作的目標(biāo)文件名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
# 設(shè)置交叉編譯工具
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) $< -o $@
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
執(zhí)行make命令,編譯生成動(dòng)態(tài)庫文件libnmeagps.so
(2) 移植nmealib庫到項(xiàng)目中
在項(xiàng)目源碼目錄中新建nmea_gps目錄,將(1)中編譯生成的libnmeagps.so和所有頭文件拷貝到nmea_gps
目錄中,在需要應(yīng)用庫借口的代碼中增加相應(yīng)頭文件的聲明即可。
項(xiàng)目Makefile增加下面內(nèi)容:
NMEA_LIB=-L./nmea_gps/ -lnmeagps
$(CXX) -o $@ $^ $(NMEA_LIB)
(3) 測(cè)試
/* nmea_lib測(cè)試程序 */
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經(jīng)度,lon緯度,sig信號(hào)指標(biāo),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;
}
三、應(yīng)用
1. 打開串口設(shè)備
hGpshandle = open("/dev/ttyS2", O_RDWR);
2. 設(shè)置串口波特率
set_serial_param(hGpshandle, 9600, 8, 1, 'n', 0);
3. 循環(huán)從串口讀取數(shù)據(jù),數(shù)據(jù)大小1024kb
readlen = read(hGpshandle, tmp_buf, 1500);
4. 數(shù)據(jù)取滿,解析gps數(shù)據(jù)
pThis->DoParserGpsData(pArg);
5. 從解析結(jié)果判斷gps信號(hào)質(zhì)量
/* 0 = Invalid; 1 = Fix; 2 = Differential, 3 = Sensitive */
if(info.sig == GPS_SIG_OK)
6. 經(jīng)緯度數(shù)據(jù)單位轉(zhuǎn)換
/* 經(jīng)緯度轉(zhuǎn)換為位置點(diǎn) */
nmea_info2pos(&info, &pos[it]);
7. gps校時(shí)
pThis->DoCheckTimeByGps(info);
8. 計(jì)算前后2個(gè)gps坐標(biāo)點(diǎn)之間距離
dist = nmea_distance(&pos[it - 1], &pos[it]);
9. 將gps坐標(biāo)信息,距離寫入記錄文件
pThis->DoWriteGpsInfoToFile(g_sCurGpsInfoPath, info, dist);
四、gps經(jīng)緯度數(shù)據(jù)單位相關(guān)
gps數(shù)據(jù)單位是一個(gè)需要注意的問題。
(以下內(nèi)容摘自網(wǎng)絡(luò))
1. GPS串口讀取的數(shù)據(jù)格式:
GPS 串口讀出的是 DDMM.MMMM格式
一般上位機(jī)是 DD.DDDDDD°或 DD°MM'SS" 格式, 這兩種都可以在 GE 里直接輸入
舉例說明: 3147.8749 (示例,經(jīng)緯度一樣) 格式為 DDMM.MMMM
轉(zhuǎn)換成度:
1. 度的部分直接就是31,
2.剩下的 MM.MMMM/60=度, 所以 47.8749/60=0.797915
則 轉(zhuǎn)換成度是 31.797915°
轉(zhuǎn)換成度分秒:
1. 同樣,度的部分直接就是31,
2. 分直接是整數(shù)部分 47
3. 秒則是 后面的 0.MMMM*60. 例子中為: 0.8749*60=52.494
4. 則度分秒即是 31°47'52.494"
看了“linux下串口gps應(yīng)用”還想看: