国产宅男网站在线|亚洲A级性爱免费视频|亚洲中精品级在线|午夜福利AA毛

  • <dd id="gf5jf"><th id="gf5jf"></th></dd>

    <cite id="gf5jf"><label id="gf5jf"></label></cite>
  • <div id="gf5jf"><listing id="gf5jf"></listing></div>
    學(xué)習(xí)啦>學(xué)習(xí)電腦>操作系統(tǒng)>Linux教程>

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

    時(shí)間: 志藝942 分享

      嵌入式系統(tǒng)是計(jì)算機(jī)技術(shù)的一種重要應(yīng)用形式。從概念上講,嵌入式系統(tǒng)并不是近來(lái)才出現(xiàn)的產(chǎn)品,但隨著計(jì)算技術(shù)和通信技術(shù)的迅速發(fā)展以及Internet的廣泛應(yīng)用,嵌入式系統(tǒng)卻從來(lái)沒有象現(xiàn)在這樣風(fēng)靡過(guò)。接下來(lái)是小編為大家收集的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—無(wú)差分定位信息 2—帶差分定位信息

      <7>使用衛(wèi)星號(hào)(00~08)

      <8>精度百分比

      <9>海平面高度

      <10>大地隨球面相對(duì)海平面的高度

      <11>差分GPS信息

      <12>差分站ID號(hào) 0000-123

      (2)最簡(jiǎn)特性(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>太陽(yáng)方位

      <11>太陽(yáng)方向

      二、nmealib庫(kù)的使用

      (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)庫(kù)文件libnmeagps.so

      (2) 移植nmealib庫(kù)到項(xiàng)目中

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

      目錄中,在需要應(yīng)用庫(kù)借口的代碼中增加相應(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è)需要注意的問(wèn)題。

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

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

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

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

      舉例說(shuō)明: 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)用實(shí)例和命令匯總

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

    2806415