學(xué)習(xí)啦>學(xué)習(xí)電腦>操作系統(tǒng)>Linux教程>

linux下串口gps應(yīng)用

時間: 志藝942 分享

  嵌入式系統(tǒng)是計算機技術(shù)的一種重要應(yīng)用形式。從概念上講,嵌入式系統(tǒng)并不是近來才出現(xiàn)的產(chǎn)品,但隨著計算技術(shù)和通信技術(shù)的迅速發(fā)展以及Internet的廣泛應(yīng)用,嵌入式系統(tǒng)卻從來沒有象現(xiàn)在這樣風(fēng)靡過。接下來是小編為大家收集的linux下串口gps應(yīng)用,希望能幫到大家。

  linux下串口gps應(yīng)用

  一、Gps數(shù)據(jù)格式標準(nmea0183)

  http://en.wikipedia.org/wiki/NMEA

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

  (1)位置信息(GGA)

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

  <1>UTC時間,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)星號(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>狀態(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)容如下:

  # 制作的目標文件名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命令,編譯生成動態(tài)庫文件libnmeagps.so

  (2) 移植nmealib庫到項目中

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

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

  項目Makefile增加下面內(nèi)容:

  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經(jīng)度,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;

  }

  三、應(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信號質(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)換為位置點 */

  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經(jīng)緯度數(shù)據(jù)單位相關(guān)

  gps數(shù)據(jù)單位是一個需要注意的問題。

  (以下內(nèi)容摘自網(wǎng)絡(luò))

  1. GPS串口讀取的數(shù)據(jù)格式:

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

  一般上位機是 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)用”還想看:

1.ftp應(yīng)用實例和命令匯總

2.關(guān)于GPS RTK技術(shù)在工程測量中的應(yīng)用分析

2806415