亚洲欧美精品沙发,日韩在线精品视频,亚洲Av每日更新在线观看,亚洲国产另类一区在线5

<pre id="hdphd"></pre>

  • <div id="hdphd"><small id="hdphd"></small></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)沒(mé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