基于ARM-LINUX的GPS導(dǎo)航系統(tǒng)_第1頁
基于ARM-LINUX的GPS導(dǎo)航系統(tǒng)_第2頁
基于ARM-LINUX的GPS導(dǎo)航系統(tǒng)_第3頁
基于ARM-LINUX的GPS導(dǎo)航系統(tǒng)_第4頁
基于ARM-LINUX的GPS導(dǎo)航系統(tǒng)_第5頁
已閱讀5頁,還剩40頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、安徽工程大學(xué)嵌入式課程設(shè)計 基于ARM_LINUX的GPS導(dǎo)航系統(tǒng)PAGE PAGE 43前言 GPS 是英文Global Positioning System(全球定位系統(tǒng))的簡稱,而其中文簡稱為“球位系”。GPS是20世紀(jì)70年代由美國陸海空三軍聯(lián)合研制的新一代空間衛(wèi)星導(dǎo)航定位系統(tǒng) 。其主要目的是為陸、海、空三大領(lǐng)域提供實(shí)時、 全天候和全球性的導(dǎo)航服務(wù),并用于情報收集、核爆監(jiān)測和應(yīng)急通訊等一些軍事目的。隨著人民生活水平的法杖,GPS技術(shù)被越來越多的應(yīng)用在個人PDA、個人車載終端、手機(jī)等個人設(shè)備上。人們通過手持GPS,能準(zhǔn)確知道自己所在的位置,從實(shí)現(xiàn)到導(dǎo)航、確定旅游路線、獲取地理信息等功能。

2、本文介紹的GPS導(dǎo)航系統(tǒng),以ARM作為主控芯片,配以GPS、TFT觸摸屏、嵌入式LINUX操作系統(tǒng),構(gòu)建了一個集GPS信息顯示、地圖顯示、語音導(dǎo)航為一體的完整系統(tǒng)。本系統(tǒng)在一定程度上推動了個人手持GPS導(dǎo)航設(shè)備研究的發(fā)展。目 錄 TOC p h z t 樣式47,1,樣式48,2,樣式49,3 第 HYPERLINK l _Toc217034712 1章 系統(tǒng)方案選擇與論證1 HYPERLINK l _Toc217034713 1.1總體設(shè)計方案 1 HYPERLINK l _Toc217034714 1.2部分模塊設(shè)計方案1 HYPERLINK l _Toc217034715 1.2.1 主

3、控芯片選擇方案 1 HYPERLINK l _Toc217034715 1.2.2 操作系統(tǒng)及選擇方案 2 HYPERLINK l _Toc217034716 1.2.3 GPS模塊設(shè)計方案2 HYPERLINK l _Toc217034718 1.2.4顯示模塊設(shè)計方案 2 HYPERLINK l _Toc217034718 1.2.5地圖文件存放方案 2 HYPERLINK l _Toc217034720 1.3總體方案確定3第2章 系統(tǒng)硬件設(shè)計42.1主控芯片電路42.2 flash芯片電路 62.3串口電路 72.4 usb接口電路 82.5系統(tǒng)總線及l(fā)cd接口電路 92.6電源電路

4、9第 HYPERLINK l _Toc217034726 3章 系統(tǒng)的軟件設(shè)計 PAGEREF _Toc217034726 h 10 HYPERLINK l _Toc217034727 3.1程序結(jié)構(gòu)框圖 PAGEREF _Toc217034727 h 10 HYPERLINK l _Toc217034728 3.2 Maintab類 PAGEREF _Toc217034728 h 11 HYPERLINK l _Toc217034729 3.3 Mainwidget類 PAGEREF _Toc217034729 h 11 HYPERLINK l _Toc217034730 3.4 confi

5、g 類 PAGEREF _Toc217034730 h 12 HYPERLINK l _Toc217034731 3.5 map類 PAGEREF _Toc217034731 h 12 HYPERLINK l _Toc217034732 3.6 gps_diver 類 PAGEREF _Toc217034732 h 13 HYPERLINK l _Toc217034735 3.7 staSNR 類 PAGEREF _Toc217034735 h 14 HYPERLINK l _Toc217034736 3.8 debug_PDF 類 PAGEREF _Toc217034736 h 15 HYP

6、ERLINK l _Toc217034737 3.9 Makefile 文件 PAGEREF _Toc217034737 h 16 HYPERLINK l _Toc217034738 3.10 地圖文件 (mapinfo.txt文件) PAGEREF _Toc217034738 h 16 HYPERLINK l _Toc217034739 第4章 測試 PAGEREF _Toc217034739 h 17 HYPERLINK l _Toc217034740 4.1操作系統(tǒng)燒寫測試 17 HYPERLINK l _Toc217034741 4.2 衛(wèi)星接收測試18 HYPERLINK l _To

7、c217034743 4.3地圖顯示測試 20 HYPERLINK l _Toc217034744 4.4GPS信號檢測測試 PAGEREF _Toc217034744 h 22 HYPERLINK l _Toc217034745 4.5功耗測試 PAGEREF _Toc217034745 h 224.6其他測試 234.7測試結(jié)果分析 23 HYPERLINK l _Toc217034746 5總結(jié) 23 HYPERLINK l _Toc217034747 參考文獻(xiàn): 23致謝 HYPERLINK l _Toc217034748 : 24附 HYPERLINK l _Toc217034749

8、 錄: 24第1章 系統(tǒng)方案選擇和論證1.1 總體設(shè)計方案個人手持設(shè)備要求界面美觀、功耗低、易于操作。系統(tǒng)應(yīng)有彩色觸摸屏;低功耗、高速度的處理芯片;帶有嵌入式操作系統(tǒng);GPS信息接收模塊;sd卡用以存放地圖;TFT觸摸屏模塊框圖分別如圖1所示:Nor flash Nand flashSd卡(存放地圖)Gps模塊S3c2440串口(調(diào)試及下載)電 源圖1 系統(tǒng)結(jié)構(gòu)框圖1.2 部分模塊設(shè)計方案1.2.1 控制模塊設(shè)計方案方案一:采用凌陽公司的16位單片機(jī),它是16位控制器,具有體積小、驅(qū)動能力高、集成度高、易擴(kuò)展、可靠性高、功耗低、結(jié)構(gòu)簡單、中斷處理能力強(qiáng)等特點(diǎn)。用于語音處理和識別等領(lǐng)域。滿足系統(tǒng)

9、GPS模塊和語音導(dǎo)航功能的需要。由于本系統(tǒng)需要彩色人機(jī)交互界面,對處理速度要求較高,故不采用。方案二:采用samsung公司的s3c2440。S3c2440采用ARM920t內(nèi)核,實(shí)現(xiàn)了MMU、ARBA、BUS和Harvard高速緩沖體系結(jié)構(gòu)。是一塊高性能、低功耗的嵌入式芯片??芍踩氩僮飨到y(tǒng)。在個人PDA領(lǐng)域應(yīng)用及廣。植入操作系統(tǒng)后,在用戶GUI編程方面具有很大優(yōu)勢。內(nèi)置AD/DA,便于擴(kuò)展語音模塊。故選用此芯片為主控芯片。1. 2. 2 操作系統(tǒng)選擇方案Linux操作系統(tǒng)廣泛應(yīng)用在嵌入式設(shè)備中,其源代碼開放、免費(fèi);內(nèi)核性能高效、多任務(wù)、可制定;完善的圖形管理、文件管理機(jī)制;良好的開發(fā)環(huán)境、強(qiáng)

10、大的工具集??梢浦睶T開發(fā)環(huán)境,可實(shí)現(xiàn)跨平臺的編譯,代碼重用率高。1.2.3 GPS模塊選擇方案方案一:采用串口接口GPS模塊。優(yōu)點(diǎn):便于驅(qū)動,價格便宜。缺點(diǎn):嵌入式linux的調(diào)試需要用到串口,若GPS模塊占用了串口會造成調(diào)試不便。故不采用方案二:采用usb接口GPS模塊。優(yōu)點(diǎn):便于攜帶、連接開發(fā)板。缺點(diǎn):驅(qū)動相對較難、價格相對較貴。為了便于調(diào)試和攜帶,采用usb接口GPS模塊。1.2.4顯示模塊設(shè)計方案方案一:采用LCD顯示。液晶顯示屏(LCD)具有輕薄短小,低耗電量。但不能實(shí)現(xiàn)觸摸功能,故部采用。方案二:采用TFT顯示。TFT屏幕帶有四線式電阻觸摸膜,能實(shí)現(xiàn)觸摸功能、便于用戶操作,故采用

11、。1.2.5地圖文件存放方案方案一:采用s3c2440核心板內(nèi)置nand flash 存放。Nand flash 讀取速度快。但容量較小,只有128M,不適合存放大量地圖數(shù)據(jù),故不采用。方案二:采用外置sd卡。Sd卡讀取速度相對較慢,且會增加成本。但能存放大量數(shù)據(jù)(),地圖更新升級也很方便。故采用。1.3 總體方案確定1) 控制芯片: 采用s3c2440 arm9 處理器2) 液晶顯示模塊: 采用NEC TFT 3.5 寸屏幕3) GPS模塊: 采用三星公司的GPS-USBII模塊4) nand flash: 采用 K9F1208;5) nor flash: 采用 AM29LV160DB5)

12、音頻處理芯片: UDA1341TS;6) SD卡 模塊: 采用金士頓公司的 4GB SD卡;7) 電源模塊: 采用兩個8V可充電鋰電池;8) 操作系統(tǒng): 采用嵌入式linux操作系統(tǒng)第2章 系統(tǒng)的硬件設(shè)計與實(shí)現(xiàn) 系統(tǒng)硬件采用友善之臂的s3c2440 mini2440開發(fā)板。Mini2440 體積小,便于攜帶;接口豐富,易于擴(kuò)展;功耗低,便于長時間戶外導(dǎo)航。Mini2440硬件特性如下圖:圖2 主控芯片電路2.1 主控芯片電路主控芯片為s3c2440的6層核心板,該核心板性能穩(wěn)定、工藝精良。圖2.1 主控芯片電路2.2 flash芯片電路2.21 nand flash芯片電路Nand flash

13、 是操作系統(tǒng)的程序存儲區(qū),該芯片掉電不丟失數(shù)據(jù)、壽命長,可反復(fù)擦寫。芯片容量128M。適合存放高密度數(shù)據(jù)結(jié)構(gòu)圖2.2.1 主控芯片電路 2.22 nor flash芯片電路Nor flash是系統(tǒng) BIOS 存儲區(qū)。該芯片掉電不丟失數(shù)據(jù)、壽命長,可反復(fù)擦寫。芯片容量8M。適合高速度、低數(shù)據(jù)密度的數(shù)據(jù)結(jié)構(gòu)。 圖2.2.2 主控芯片電路 2.3 串口電路 采用max3232電平轉(zhuǎn)換芯片與計算機(jī)通信圖2.3 串口電路2.4 usb端口電路采用usb2.0協(xié)議,usb接口用以連接gps模塊圖2.4 usb端口電路2.5 系統(tǒng)總線及l(fā)cd接口電路圖2.5系統(tǒng)總線及l(fā)cd接口電路2.6 電源電路系統(tǒng)輸入電

14、壓為DC5VC,通過LM1117-1.8、LM1117-33、MAX8869EU18芯片轉(zhuǎn)換成系統(tǒng)需要的三種電壓:1.8V、3.3V、1.25V圖2.6 電源電路第3章 系統(tǒng)的軟件設(shè)計本系統(tǒng)的所有程序均采用C+語言編寫,開發(fā)工具為QT embed 2.0。程序定義了許多類來分別管理各個模塊,通過對各個類的操作,來構(gòu)建整個程序框架。3.1 程序整體結(jié)構(gòu)框圖圖3.1 maintab類流程圖 3.2 Maintab類 Maintab 類負(fù)責(zé)程序外框基本定義及程序初始化 開始 設(shè)置好衛(wèi)星信號強(qiáng)度數(shù)據(jù)設(shè)置窗口大小、顏色顯示窗口圖3.2 maintab類流程圖3.3 mainwidgt類Mainwidgt

15、類負(fù)責(zé)對各個按鈕部件、頁面部件的初始化開始 定義GPS時鐘 繪制主框 繪制上下左右四個按鍵 繪制三個頁面標(biāo)簽 連接點(diǎn)擊按鈕事件與處理按鍵程序 結(jié)束圖3.3 mainwidget 類流程圖3.4 config類流程圖Config類用以實(shí)現(xiàn)對地圖路徑、gps模塊波特率的設(shè)置 開始 設(shè)置地圖路徑 設(shè)置gps的波特率 結(jié)束圖3.4 config 類流程圖3.5 map類Map類負(fù)責(zé)讀取mapinfo文件里的地圖 ,并顯示對應(yīng)地圖。地圖顯示算法:首先把地圖分割成n*n小塊。然后系統(tǒng)通過得知整張地圖四角的坐標(biāo),計算出地圖每個像素點(diǎn)所對應(yīng)的坐標(biāo)。最后根據(jù)讀取的gps信息,找到對應(yīng)的地圖,并顯示到lcd上。

16、開始 讀取地圖的基本信息根據(jù)當(dāng)前gps信息找到對應(yīng)的地圖并顯示 N 地圖按鍵按下 Y 修改顯示的地圖 結(jié)束圖3.5 map 類流程圖3.6 gps_diver類gps_diver類負(fù)責(zé)驅(qū)動gps模塊,gps驅(qū)動原理如下所述: GPS衛(wèi)星發(fā)射兩種頻率的載波信號,即頻率為1575.42MHz的L1載波和頻率為1227.60HMz的L2載波。L1為民用頻率,L2為軍用。民用GPS信號調(diào)試成C/A碼發(fā)送,C/A碼又被稱為粗捕獲碼,是1MHz的偽隨機(jī)噪聲碼(PRN碼),其碼長為1023位(周期為1ms)。用戶機(jī)接受到C/A碼后,通過gps接受器,解調(diào)為發(fā)送次C/A碼的衛(wèi)星時間。并通過多個衛(wèi)星發(fā)送的C/A

17、碼時間差(至少3個),來確定當(dāng)前位置。并以串口的形式把經(jīng)緯度數(shù)據(jù)發(fā)送給上位機(jī)。 開始 設(shè)置串口屬性,訪問gps模塊設(shè)置gps時鐘 驅(qū)動gps模塊計算經(jīng)緯度坐標(biāo)值結(jié)束圖3.6 gps_driver類流程圖 3.7 staSNR類StaSnR類負(fù)責(zé)對檢測衛(wèi)星數(shù)量,并告知gps_driver類。 開始 檢測衛(wèi)星數(shù)量 N 衛(wèi)星數(shù)量3?Y 結(jié)束圖3.7 strSNR類流程圖 3.8 debugPDF類debugPDF類負(fù)責(zé)提供調(diào)試信息,錯誤編號等內(nèi)容。調(diào)試程序時,配合linux中g(shù)db命令。能實(shí)現(xiàn)斷點(diǎn)調(diào)試、逐步調(diào)試等功能并顯示對應(yīng)的錯誤信息。定義如下:#include #include #ifndef

18、DEBUG_PDF_H#define DEBUG_PDF_H/=debug level for info trace bug #define debug 1#define POP3DEBUG 1#ifdef POP3DEBUG #define PDF(level, fmt, args.) if (debug = level) printf(%s:%d fmt, _PRETTY_FUNCTION_, _LINE_ , # args)#else#define PDF(level, fmt, args.) do while(0)#endif0:沒有任何的顯示!1:正常工作的,能顯示工作運(yùn)行主流程er

19、ror exit fatal show it2:更進(jìn)一顯示信息3:完全跟蹤!3.9 Makefile文件Makefile文件為整個工程的管理文件 ,作用是連接各個頭文件、c文件,最終編譯成可執(zhí)行文件。由于使用qt開發(fā)環(huán)境,程序可以在x86平臺上與arm平臺上分別運(yùn)行。只需要修改Makefile文件中的編譯期即可。3.10 地圖文件(mapinfo.txt 文件)地圖文件由一大張成都市區(qū)地圖分割成許多小地圖。Map.cfg文件里包含了整張地圖信息。mapinfo:103.831787,30.687817,104.314155,30.473525,1500,1200,300。分別代表整個地圖的左上

20、角經(jīng)緯度、右下角經(jīng)緯度、地圖像素的長度、地圖像素的寬度、每張地圖的像素寬度。軟件通過讀取map.cfg的內(nèi)容,來獲取地圖的基本信息。地圖軟件獲取方法:采用專業(yè)地圖下載軟件 UMD(universal maps download),用戶只需在此軟件里輸入想要地圖的四角經(jīng)緯度坐標(biāo)。即可得到所需地圖。保證mapinfo.txtL里的地圖坐標(biāo)與實(shí)際坐標(biāo)一致。第4章 測試4.1 操作系統(tǒng)燒寫測試安裝操作系統(tǒng)測試的目的是搭建系統(tǒng)的軟件環(huán)境,便于后續(xù)工作安裝linux有如下步驟格式化nand flash安裝bootloader安裝內(nèi)核文件安裝文件系統(tǒng)如下圖所示圖4.1.1 燒寫操作系統(tǒng)-vivi界面安裝好操

21、作系統(tǒng)后,重啟系統(tǒng),將出現(xiàn)如下畫面。 圖 4.1.2 操作系統(tǒng)啟動畫面系統(tǒng)燒寫成功4.2 衛(wèi)星接收測試衛(wèi)星接收測試的目的是檢測接收到衛(wèi)星的數(shù)量,以便在接收到相同衛(wèi)星的情況下,檢測gps信號。測試位置:四川省成都市。第一次測試:位置室內(nèi) 衛(wèi)星數(shù)量 0 如下圖: 圖 4.2.1 第一次衛(wèi)星接收測試第二次測試:位置室外空曠地帶 衛(wèi)星數(shù)量 7 如下圖: 圖 4.2.2 第二次衛(wèi)星接收測試第三次測試:位置街道 衛(wèi)星數(shù)量 6 如下圖:圖 4.2.3 第三次衛(wèi)星接收測試經(jīng)測試,在室內(nèi)不能接收到衛(wèi)星的gps信號。故此系統(tǒng)只能在戶外使用。4.3 地圖顯示測試地圖顯示測試的目的是測試載入地圖的正誤、驗(yàn)證地圖上下左

22、右移動的功能。第一次測試: 能實(shí)現(xiàn)上下左右移動,顯示地圖如下圖: 圖 4.3.1第一次地圖顯示測試第二次測試:能實(shí)現(xiàn)上下左右移動,顯示地圖如下圖: 圖 4.3.2 第二次地圖顯示測試第三次測試:能實(shí)現(xiàn)上下左右移動,顯示地圖如下圖: 圖 4.3.3 第三次地圖顯示測試 經(jīng)測試地圖能準(zhǔn)確的載入,并能實(shí)現(xiàn)上下左右移動的功能4.4 gps信號檢測測試 Gps信號測試的目的是測試gps信號的精確度,測試數(shù)據(jù)列于表3中。表3 gps數(shù)據(jù)測量表測試次數(shù)(次)第一次第二次第三次顯示經(jīng)緯度東經(jīng):30.797415北緯:106.080517東經(jīng):30.813544北緯: 106.09684 東經(jīng):30.80453

23、4北緯:106.08542 實(shí)際經(jīng)緯度東經(jīng):30.797367北緯:106.080235 東經(jīng):30.797415北緯:106.09851 東經(jīng):30.797415北緯:106.08846誤差計算 0.013 0.012 0.0011%從上表可以看出,gps數(shù)據(jù)精確度較高,誤差都在0.01%左右4.5 功耗測試測試環(huán)境:戶外系統(tǒng)使用硬件:gps模塊、sd卡、液晶屏測試次數(shù)(次)第一次第二次第三次電流 300毫安 350 毫安 320毫安電壓 3.32V 3.31V 2.95V功耗 0.99W 1.15W 0.94W從上表可看出,系統(tǒng)功耗在1w左右。能滿足設(shè)計技術(shù)指標(biāo)。4.6 其他測試1)地圖路

24、徑變更測試 。 功能實(shí)現(xiàn),測試通過2)gps串口波特率設(shè)置。 功能實(shí)現(xiàn),測試通過 4.7 測試結(jié)果分析由以上的測試數(shù)據(jù)可以看出:本GPS導(dǎo)航系統(tǒng)能很好地實(shí)現(xiàn)題目要求的各項(xiàng)功能。測試期間運(yùn)行穩(wěn)定,基本達(dá)到了設(shè)計要求。5 總結(jié)本系統(tǒng)成功的模擬了個人手持gps導(dǎo)航系統(tǒng)。用戶通過點(diǎn)擊觸摸屏幕、方便的使用軟件。實(shí)現(xiàn)了地圖的顯示、拖動;gps信息、衛(wèi)星數(shù)量的顯示;地圖路徑的更改;gps波特率的更改的功能。系統(tǒng)低功耗、高處理速度、操作簡易、界面有好。已具有一定的實(shí)用價值。通過這次畢業(yè)設(shè)計,我在更加牢固、靈活地掌握了所學(xué)的專業(yè)知識的同時。大量學(xué)習(xí)了嵌入式方面的相關(guān)知識:arm體系結(jié)構(gòu)、操作系統(tǒng)、c+編程、sh

25、ell編程、硬件驅(qū)動程序。參考文獻(xiàn):1 杜春雷 ARM體系結(jié)構(gòu)與編程 清華大學(xué)出版社 2003-08-12 2 c+語言程序設(shè)計(第三版) 鄭莉 董淵 張瑞豐 編著 清華大學(xué)出版社 2001-10-113 嵌入式系統(tǒng)開發(fā) 齊宇 徐俊 編著 人民郵電出版社 2005-06-054 美Douglas Boling 嵌入式linux編程 北京科彥科技發(fā)展公司 譯 北京大學(xué)出版社 2003-03-125 張洪斌 QT編程指南 電子科技大學(xué)出版社 2006-06-126 李先力 文蒼茂 GPS原理及應(yīng)用清華大小而出版社 2004-08-278 HYPERLINK /book/search_pub.php

26、?category=01&key2=%C0%EE%D0%C2%B7%E5 t _blank 李新峰 HYPERLINK /book/search_pub.php?category=01&key2=%BA%CE%B9%E3%C9%FA t _blank 何廣生 HYPERLINK /book/search_pub.php?category=01&key2=%D5%D4%D0%E3%CE%C4 t _blank 趙秀文 基于ARM9的嵌入式Linux開發(fā)技術(shù) 電子工業(yè)出版社2003-03-189周鳴爭 嵌入式系統(tǒng)與應(yīng)用 中國鐵道出版社 2011-03-12致謝至此,我的課程設(shè)計已經(jīng)基本完成?;叵脒^

27、去的點(diǎn)點(diǎn)滴滴,如果沒有學(xué)校、學(xué)院、老師、同學(xué)的關(guān)心和幫助,我也無法按期完成這令我滿意的課程設(shè)計。在此,我首先感謝學(xué)校和學(xué)院為我提供優(yōu)越的實(shí)驗(yàn)場所和器材,使我能夠更加方便、順利地進(jìn)行作品設(shè)計與調(diào)試,減少了設(shè)計時間;其次,我要感謝指導(dǎo)老師鮑廣喜老師在百忙之中抽出時間同我一起探討系統(tǒng)構(gòu)架和軟件的編寫,并不厭其煩地替我提供資料,給我了莫大的幫助,并使我學(xué)到了很多東西。鮑老師嚴(yán)謹(jǐn)負(fù)責(zé)的治學(xué)態(tài)度,給我留下了深刻的印象,將使我終身受益。我再次對鮑老師這學(xué)期對我的關(guān)心和幫助表示最誠摯的謝意;最后,向在整個課程設(shè)計過程中關(guān)心和幫助過我的其他老師和同學(xué)致謝。附錄:附錄1:測試儀器表7 測試儀器設(shè)備清單序號型號、名

28、稱用途數(shù)量1PC機(jī)編譯程序12UT33D 數(shù)字萬用表測量各電路工作情況13Gps導(dǎo)航儀測試顯示的gps正誤14vm虛擬機(jī)測試操作系統(tǒng)15成都、南充市區(qū)地圖測試顯示地圖正誤26精密電流、電壓表測試系統(tǒng)功耗2附錄2:部分參考源程序Maintab 類程序:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #inc

29、lude #include #include /=#include MainWidget.h#include zhMap.h#include gps_driver.h#include maintab.h#include GPS.hMainTab:MainTab(QWidget *parent,const char * name):QTabWidget(parent,name)GpMainLayout=new MainLayout;GpGPS=new GPS;GpConfig=new Config;GpConfig-GetObject(GpMainLayout);GpConfig-GetObje

30、ct(GpGPS);GpConfig-setCOMBDRate();GpConfig-setMapPath();addTab(GpMainLayout,QString(MAP);addTab(GpGPS,QString(GPS INFO);addTab(GpConfig,QString(CONFIG);timerid=startTimer(1000);void MainTab:timerEvent(QTimerEvent * event)GPS_DATA mGPSData;int i;PDF(3,TABMaster timer alarm!n);/=設(shè)置好衛(wèi)星信號強(qiáng)度數(shù)據(jù)!GpGPS-mpSa

31、tSNR-SetData(GpMainLayout-pzhDrawRect-pGpsdriver-mGPSStaSNR);/=GpMainLayout-pzhDrawRect-pGpsdriver-GetData(mGPSData);GpGPS-mpGPSinfo-SetData(mGPSData);/=PDF(3,TABMaster timer endn);int main(int argc, char* argv) QApplication app(argc,argv);MainTab t;app.setMainWidget(&t);t.show();return app.exec();G

32、ps_driver 類程序:#include #include gps_driver.h#include #include #include #include /*NMEA 0183 的 Checksum 只能作8位異或包括,的運(yùn)算,但不包括$ 及 * 定義符號的運(yùn)算。 最后的兩位是檢驗(yàn)碼的hex(16進(jìn)制)轉(zhuǎn)成ASCII 兩個符號 (0-9, A-F)。*/char nmea_checksum(char *sentence)/* is the checksum on the specified sentence good? */unsigned char sum = 0;char c, *p

33、 = sentence,csum2; c = *p; while (c != *) sum = c;p+;c=*p; /= csum0=sum&0 x0f; if(csum0=10) csum0+=A; else csum0+=0;/= csum1=(sum&0 xf0)4; if(csum1=10) csum1+=A; else csum1+=0;c= (csum1=toupper(p1) & csum0=toupper(p2) );return c;/ 0 is error int zh_gpsDriver:fifoctl(FifoType * priv ,int data ,const

34、unsigned char flag)int temp = -1;unsigned int widx = 0; widx = priv-w_idx; /* Save the old index before proceeding */ if (flag = WR) /write data /* Save it to buffer */ if (priv-w_idx + 1) % BUFSIZE) = priv-r_idx) /* Adjust read index since buffer is full */ /* 無法寫入來處理fifo滿。can wd to fifo */ /priv-r

35、_idx = (priv-r_idx + 1) % BUFSIZE;/保證是環(huán)狀的FIFO。 PDF(2,buffer fulln);return -1; priv-bufferpriv-w_idx = data; priv-w_idx = (priv-w_idx + 1) % BUFSIZE;/保證是環(huán)狀的FIFO。 return 0; else /read data if (priv-r_idx = widx) PDF(2, buffer emptyn);return -1; else temp= priv-bufferpriv-r_idx; priv-r_idx = (priv-r_id

36、x + 1) % BUFSIZE;/保證是環(huán)狀的FIFO。return temp; PDF(2, flag errorn);return -1;zh_gpsDriver:zh_gpsDriver(QObject * parent,const char * name):QObject(parent,name)COM_PARAM mCOMParam;mCOMParam.SerialDevicePath=/dev/ttyUSB0;mCOMParam.BaudRate=9600;id=startTimer(200);buf.pos=0;buf.sw=0;mpGPS_GPRMC=&mGPS_GPRMC;

37、mpGPS_GPRMC-gps_sw=V;mpGPS_GPGSV=&mGPS_GPGSV;PDF(1,gps driver construct!n);/* Open modem device for reading and writing and not as controlling * tty. | O_NONBLOCK*/fd=-1;setCOM(mCOMParam);int zh_gpsDriver:GPRS_GetTextLineFromFIFO( CMD_BUF * pcmd_buf) / 去掉換行符 int j=0;int idata;do idata=fifoctl(&fifo,

38、idata,RD);if(idata=-1) return 0;else if(idata=n) pcmd_buf-bufpcmd_buf-pos=(char)(idata&0 x00ff);pcmd_buf-pos+;pcmd_buf-sw=1;break;elsepcmd_buf-bufpcmd_buf-pos=idata;pcmd_buf-pos+;while(j+pos)(BUFSIZE-5) PDF(2,potential fiflo overflow!n);CMDBUF_Init(pcmd_buf);PDF(2,pos=%dn,pcmd_buf-pos);pcmd_buf-bufp

39、cmd_buf-pos=0;/PDF(4,pos=%d ibufpos=%d a msg=%sn,pos,ibufpos,pStrBuffer); return 1;int zh_gpsDriver:zh_getGPSdata(GPS_DATA & gpsdata)PDF(3,zh_getGPSdata!n);gpsdata.lati=mpGPS_GPRMC-latitude;gpsdata.lont=mpGPS_GPRMC-longitude ;return mpGPS_GPRMC-gps_sw;double ddmm2dddd(double ddmm)double fi,ffz,ffx;i

40、nt fz;fi=ddmm;fz=(int)fi; ffz=(double)fz;/取整數(shù)部分ffx=fi-ffz;/取小數(shù)部分fi=ffz+ffx/0.6; PDF(2,ddmm=%lf dddd:%lfn ,ddmm,fi ); return fi; int zh_gpsDriver:GPGSV_Analysis( GPS_GPGSV * pGPS_GPGSV)switch(pGPS_GPGSV-GSV_ID)case 1:memcpy(&(mGPSStaSNR.Sta0),&(pGPS_GPGSV-Sta1),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.St

41、a1),&(pGPS_GPGSV-Sta2),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta2),&(pGPS_GPGSV-Sta3),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta3),&(pGPS_GPGSV-Sta4),sizeof(STA_INFO);break;case 2:memcpy(&(mGPSStaSNR.Sta4),&(pGPS_GPGSV-Sta1),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta5),&(pGPS_GPGSV-Sta2),sizeof(STA_INFO)

42、;memcpy(&(mGPSStaSNR.Sta6),&(pGPS_GPGSV-Sta3),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta7),&(pGPS_GPGSV-Sta4),sizeof(STA_INFO);break;case 3:memcpy(&(mGPSStaSNR.Sta8),&(pGPS_GPGSV-Sta1),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta9),&(pGPS_GPGSV-Sta2),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta10),&(pGPS_GPGS

43、V-Sta3),sizeof(STA_INFO);memcpy(&(mGPSStaSNR.Sta11),&(pGPS_GPGSV-Sta4),sizeof(STA_INFO);break;default:break;int zh_gpsDriver:CMD_Analysis( CMD_BUF * pcmd_buf )char* pcmd;int i;if( pcmd_buf-sw =1) PDF(3,sentence: %sn endn,pcmd_buf-buf);pcmd=strstr(&pcmd_buf-buf0,$GPRMC);/只對此語句解析if (pcmd!=NULL) if (!n

44、mea_checksum(&pcmd1) PDF(2,check sum errorn);/*CMDBUF_Init(&buf); return 1;*/ /2:判斷有效性。i= sscanf(pcmd,%*AV%c,&mpGPS_GPRMC-gps_sw);PDF(3,gpsSwFiled=%cn,mpGPS_GPRMC-gps_sw);if(mpGPS_GPRMC-gps_sw=V) PDF(3,V invalid datan); CMDBUF_Init(&buf); return 2; /sscanf 并不能由空值來輸入浮點(diǎn)數(shù)。 / printf(Gpsid=%sn utc_time=%

45、sn gps_sw=%cn latitude=%lfn lati_ns=%cn longitude=%lfn longi_ew=%cn spd=%lf,/Gpsid,utc_time,gps_sw,latitude, lati_ns,longitude,longi_ew,spd); i= sscanf(pcmd,%,%,%c,%lf,%c,%lf,%c,%lf,%lf,%,%lf,%c,%s,mpGPS_GPRMC-Gpsid, mpGPS_GPRMC-utc_time,&mpGPS_GPRMC-gps_sw, &mpGPS_GPRMC-latitude,&mpGPS_GPRMC-lati_n

46、s, &mpGPS_GPRMC-longitude,&mpGPS_GPRMC-longi_ew,/*7*/&mpGPS_GPRMC-speed,&mpGPS_GPRMC-angle,mpGPS_GPRMC-utc_date,&mpGPS_GPRMC-magneDeclinat,&mpGPS_GPRMC-magneDeclinatAngle,mpGPS_GPRMC-sumCheck);/請檢查 sscanf 的返回值,可能會失敗,如果小于要收得的數(shù)目。if(igps_sw=V; CMDBUF_Init(&buf);return 3;/轉(zhuǎn)換成度制,而不是度,分,十進(jìn)制分形式。mpGPS_GPRMC

47、-latitude=ddmm2dddd(mpGPS_GPRMC-latitude/100);mpGPS_GPRMC-longitude=ddmm2dddd(mpGPS_GPRMC-longitude/100);PDF(3,gps_sw=%cn latitude=%lfn lati_ns=%cn, mpGPS_GPRMC-gps_sw,mpGPS_GPRMC-latitude, mpGPS_GPRMC-lati_ns);PDF(3,longitude=%lfn longi_ew=%cn, mpGPS_GPRMC-longitude,mpGPS_GPRMC-longi_ew);goto out;/

48、=pcmd=strstr(&pcmd_buf-buf0,$GPGSV);/只對此語句解析if (pcmd!=NULL) if (!nmea_checksum(&pcmd1) PDF(2,check sum errorn);/*CMDBUF_Init(&buf); return 1;*/sscanf 并不能由空值來輸入浮點(diǎn)數(shù)。i= sscanf(pcmd,%,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%s,mpGPS_GPGSV-GPGSV, &mpGPS_GPGSV-GSV_NOB,&mpGPS_GPGSV-GSV_ID,

49、 &mpGPS_GPGSV-StaNOB,&mpGPS_GPGSV-Sta1.StaID,&mpGPS_GPGSV-Sta1.StaA,&mpGPS_GPGSV-Sta1.StaB,&mpGPS_GPGSV-Sta1.StaSNR,&mpGPS_GPGSV-Sta2.StaID,&mpGPS_GPGSV-Sta2.StaA,&mpGPS_GPGSV-Sta2.StaB,&mpGPS_GPGSV-Sta2.StaSNR,&mpGPS_GPGSV-Sta3.StaID,&mpGPS_GPGSV-Sta3.StaA,&mpGPS_GPGSV-Sta3.StaB,&mpGPS_GPGSV-Sta3.S

50、taSNR,&mpGPS_GPGSV-Sta4.StaID,&mpGPS_GPGSV-Sta4.StaA,&mpGPS_GPGSV-Sta4.StaB,&mpGPS_GPGSV-Sta4.StaSNR,mpGPS_GPGSV-sumCheck);/請檢查 sscanf 的返回值,可能會失敗,如果小于要收得的數(shù)目。GPGSV_Analysis(mpGPS_GPGSV);/存入數(shù)據(jù)中!i+; goto out;out:CMDBUF_Init(&buf);return 0;voidzh_gpsDriver:CMDBUF_Init( CMD_BUF * pcmd_buf )pcmd_buf-pos=0

51、;pcmd_buf-sw=0; intzh_gpsDriver:GetData(GPS_DATA &GPSData)PDF(3,zh_getGPSdata!n);GPSData.lati=mpGPS_GPRMC-latitude;GPSData.lont=mpGPS_GPRMC-longitude ;GPSData.sw=mpGPS_GPRMC-gps_sw;return mpGPS_GPRMC-gps_sw;intzh_gpsDriver:GetData(GPS_STASNR & GPSStaSNR)GPSStaSNR=mGPSStaSNR;int zh_gpsDriver:setCOM(C

52、OM_PARAM & COMParam)/它是唯一控制串口的,int i;struct termios attr; / 打開串口 if(fd=-1)/close(fd); COMParam.COMfd = open(COMParam.SerialDevicePath, O_RDWR |O_NONBLOCK); / fd=COMParam.COMfd; if (COMParam.COMfd = -1) printf(open device:%s error!n,COMParam.SerialDevicePath);return -1; else printf(open device:%s ok!

53、n,COMParam.SerialDevicePath); / 讀取串口當(dāng)前屬性 i=tcgetattr(fd , &attr); if(i!=0) printf(error for get attr!n);return -1; /=設(shè)置好波特率if(COMParam.BaudRate=4800)i=cfsetispeed(&attr,B4800);i=cfsetospeed(&attr,B4800); if(i!=0) printf(error for get attr!n);return -1; else if(COMParam.BaudRate=9600)i=cfsetispeed(&a

54、ttr,B9600);i=cfsetospeed(&attr,B9600);if(i!=0) printf(error for get attr!n);return -1; else printf(error BaudRaet=%d,only support BaudRate 4800/9600! n,COMParam.BaudRate);if(tcsetattr(fd,TCSANOW,&attr)!=0) printf(active set attr error!n);return -1; /=return fd;void zh_gpsDriver:WfifoFixString(char d

55、ata)static int flag=0;if(data!=,) flag=0;else if(flag=1) fifoctl(&fifo,0,WR);else flag=1;fifoctl(&fifo,(int) data,WR);void zh_gpsDriver:timerEvent(QTimerEvent * event)int readbytes,i,j;char c;if(event-timerId()=id)PDF(3,zh_gpsDriver timer is alarm!n);/=for(j=0;j 0 )PDF(2,tty readbytes1=%dn,readbytes

56、);for (i = 0 ; i readbytes ; i+ ) c = rdBufi;WfifoFixString(c);/=while(GPRS_GetTextLineFromFIFO(&buf)CMD_Analysis(&buf);/ 解析完所有的語句。PDF(3,zh_gpsDriver timer out!n);/=else PDF(3,not this timer is alarm!n);Map 類程序:#include zhMap.h/=經(jīng)緯值#define zhPR 8 /use for the zh point sizeint zhMap:CMD_Analysis( cha

57、r * pcmd_buf )char* pcmd;int i;char msgid20;/=pcmd=strstr(&pcmd_buf0,mapinfo:);/只對此語句解析if (pcmd!=NULL) i= sscanf(pcmd,%:%lf,%lf,%lf,%lf,%d,%d,%d,msgid, &A_lont,&A_lati, &B_lont,& B_lati, &Width,&Height,/*7*/&subWidth);/請檢查 sscanf 的返回值,可能會失敗,如果小于要收得的數(shù)目。if(i8) PDF(2,sscanf error mapcfgn); return 1;PDF

58、(2,A_lont=%lf,A_lati=%lf, B_lont=%lf,B_lati=%lfn,A_lont,A_lati, B_lont,B_lati);PDF(2,Width=%d,Height=%d,subWidth=%dn,Width,Height,subWidth);return 0;/=pcmd=strstr(&pcmd_buf0,xxx);/只對此語句解析if (pcmd!=NULL) return 0;int zhMap:readMapCfg(QString Mapstr)Mapstr+=/map.cfg;const char * OfilePtr=Mapstr.latin1

59、();/Mapstr.toStdString();/./config.txt; FILE * infile;char msg512;PDF(2,OfilePtr=%sn, OfilePtr); if (infile = fopen(OfilePtr, rb) = NULL) PDF(1,cant open map.cfg filen);return -1; /= while(fgets(msg, sizeof(msg), infile)!=NULL) PDF(2,mapcfg=%sn, msg); CMD_Analysis(msg); fclose(infile);return 0;/=zhM

60、ap:zhMap(QWidget * parent ,const char * name):QWidget(parent,name)/* A_lont=114.350683;/左上點(diǎn)經(jīng)度 小數(shù)度數(shù)制 A_lati=30.5360;/左上點(diǎn)緯度 B_lont=114.3684;/右下點(diǎn)經(jīng)度 B_lati=30.521867;/右下點(diǎn)緯度Width=1080;/像素的 Height=978; subWidth=300;/分割時,子圖的尺寸*/=設(shè)置好地圖路徑QStrmappath=/home/map;mapPath=QStrmappath.latin1();readMapCfg(QStrmappa

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論