




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、安徽工程大學嵌入式課程設計 基于ARM_LINUX的GPS導航系統PAGE PAGE 43前言 GPS 是英文Global Positioning System(全球定位系統)的簡稱,而其中文簡稱為“球位系”。GPS是20世紀70年代由美國陸海空三軍聯合研制的新一代空間衛星導航定位系統 。其主要目的是為陸、海、空三大領域提供實時、 全天候和全球性的導航服務,并用于情報收集、核爆監測和應急通訊等一些軍事目的。隨著人民生活水平的法杖,GPS技術被越來越多的應用在個人PDA、個人車載終端、手機等個人設備上。人們通過手持GPS,能準確知道自己所在的位置,從實現到導航、確定旅游路線、獲取地理信息等功能。
2、本文介紹的GPS導航系統,以ARM作為主控芯片,配以GPS、TFT觸摸屏、嵌入式LINUX操作系統,構建了一個集GPS信息顯示、地圖顯示、語音導航為一體的完整系統。本系統在一定程度上推動了個人手持GPS導航設備研究的發展。目 錄 TOC p h z t 樣式47,1,樣式48,2,樣式49,3 第 HYPERLINK l _Toc217034712 1章 系統方案選擇與論證1 HYPERLINK l _Toc217034713 1.1總體設計方案 1 HYPERLINK l _Toc217034714 1.2部分模塊設計方案1 HYPERLINK l _Toc217034715 1.2.1 主
3、控芯片選擇方案 1 HYPERLINK l _Toc217034715 1.2.2 操作系統及選擇方案 2 HYPERLINK l _Toc217034716 1.2.3 GPS模塊設計方案2 HYPERLINK l _Toc217034718 1.2.4顯示模塊設計方案 2 HYPERLINK l _Toc217034718 1.2.5地圖文件存放方案 2 HYPERLINK l _Toc217034720 1.3總體方案確定3第2章 系統硬件設計42.1主控芯片電路42.2 flash芯片電路 62.3串口電路 72.4 usb接口電路 82.5系統總線及lcd接口電路 92.6電源電路
4、9第 HYPERLINK l _Toc217034726 3章 系統的軟件設計 PAGEREF _Toc217034726 h 10 HYPERLINK l _Toc217034727 3.1程序結構框圖 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操作系統燒寫測試 17 HYPERLINK l _Toc217034741 4.2 衛星接收測試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測試結果分析 23 HYPERLINK l _Toc217034746 5總結 23 HYPERLINK l _Toc217034747 參考文獻: 23致謝 HYPERLINK l _Toc217034748 : 24附 HYPERLINK l _Toc217034749
8、 錄: 24第1章 系統方案選擇和論證1.1 總體設計方案個人手持設備要求界面美觀、功耗低、易于操作。系統應有彩色觸摸屏;低功耗、高速度的處理芯片;帶有嵌入式操作系統;GPS信息接收模塊;sd卡用以存放地圖;TFT觸摸屏模塊框圖分別如圖1所示:Nor flash Nand flashSd卡(存放地圖)Gps模塊S3c2440串口(調試及下載)電 源圖1 系統結構框圖1.2 部分模塊設計方案1.2.1 控制模塊設計方案方案一:采用凌陽公司的16位單片機,它是16位控制器,具有體積小、驅動能力高、集成度高、易擴展、可靠性高、功耗低、結構簡單、中斷處理能力強等特點。用于語音處理和識別等領域。滿足系統
9、GPS模塊和語音導航功能的需要。由于本系統需要彩色人機交互界面,對處理速度要求較高,故不采用。方案二:采用samsung公司的s3c2440。S3c2440采用ARM920t內核,實現了MMU、ARBA、BUS和Harvard高速緩沖體系結構。是一塊高性能、低功耗的嵌入式芯片。可植入操作系統。在個人PDA領域應用及廣。植入操作系統后,在用戶GUI編程方面具有很大優勢。內置AD/DA,便于擴展語音模塊。故選用此芯片為主控芯片。1. 2. 2 操作系統選擇方案Linux操作系統廣泛應用在嵌入式設備中,其源代碼開放、免費;內核性能高效、多任務、可制定;完善的圖形管理、文件管理機制;良好的開發環境、強
10、大的工具集。可移植QT開發環境,可實現跨平臺的編譯,代碼重用率高。1.2.3 GPS模塊選擇方案方案一:采用串口接口GPS模塊。優點:便于驅動,價格便宜。缺點:嵌入式linux的調試需要用到串口,若GPS模塊占用了串口會造成調試不便。故不采用方案二:采用usb接口GPS模塊。優點:便于攜帶、連接開發板。缺點:驅動相對較難、價格相對較貴。為了便于調試和攜帶,采用usb接口GPS模塊。1.2.4顯示模塊設計方案方案一:采用LCD顯示。液晶顯示屏(LCD)具有輕薄短小,低耗電量。但不能實現觸摸功能,故部采用。方案二:采用TFT顯示。TFT屏幕帶有四線式電阻觸摸膜,能實現觸摸功能、便于用戶操作,故采用
11、。1.2.5地圖文件存放方案方案一:采用s3c2440核心板內置nand flash 存放。Nand flash 讀取速度快。但容量較小,只有128M,不適合存放大量地圖數據,故不采用。方案二:采用外置sd卡。Sd卡讀取速度相對較慢,且會增加成本。但能存放大量數據(),地圖更新升級也很方便。故采用。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) 操作系統: 采用嵌入式linux操作系統第2章 系統的硬件設計與實現 系統硬件采用友善之臂的s3c2440 mini2440開發板。Mini2440 體積小,便于攜帶;接口豐富,易于擴展;功耗低,便于長時間戶外導航。Mini2440硬件特性如下圖:圖2 主控芯片電路2.1 主控芯片電路主控芯片為s3c2440的6層核心板,該核心板性能穩定、工藝精良。圖2.1 主控芯片電路2.2 flash芯片電路2.21 nand flash芯片電路Nand flash
13、 是操作系統的程序存儲區,該芯片掉電不丟失數據、壽命長,可反復擦寫。芯片容量128M。適合存放高密度數據結構圖2.2.1 主控芯片電路 2.22 nor flash芯片電路Nor flash是系統 BIOS 存儲區。該芯片掉電不丟失數據、壽命長,可反復擦寫。芯片容量8M。適合高速度、低數據密度的數據結構。 圖2.2.2 主控芯片電路 2.3 串口電路 采用max3232電平轉換芯片與計算機通信圖2.3 串口電路2.4 usb端口電路采用usb2.0協議,usb接口用以連接gps模塊圖2.4 usb端口電路2.5 系統總線及lcd接口電路圖2.5系統總線及lcd接口電路2.6 電源電路系統輸入電
14、壓為DC5VC,通過LM1117-1.8、LM1117-33、MAX8869EU18芯片轉換成系統需要的三種電壓:1.8V、3.3V、1.25V圖2.6 電源電路第3章 系統的軟件設計本系統的所有程序均采用C+語言編寫,開發工具為QT embed 2.0。程序定義了許多類來分別管理各個模塊,通過對各個類的操作,來構建整個程序框架。3.1 程序整體結構框圖圖3.1 maintab類流程圖 3.2 Maintab類 Maintab 類負責程序外框基本定義及程序初始化 開始 設置好衛星信號強度數據設置窗口大小、顏色顯示窗口圖3.2 maintab類流程圖3.3 mainwidgt類Mainwidgt
15、類負責對各個按鈕部件、頁面部件的初始化開始 定義GPS時鐘 繪制主框 繪制上下左右四個按鍵 繪制三個頁面標簽 連接點擊按鈕事件與處理按鍵程序 結束圖3.3 mainwidget 類流程圖3.4 config類流程圖Config類用以實現對地圖路徑、gps模塊波特率的設置 開始 設置地圖路徑 設置gps的波特率 結束圖3.4 config 類流程圖3.5 map類Map類負責讀取mapinfo文件里的地圖 ,并顯示對應地圖。地圖顯示算法:首先把地圖分割成n*n小塊。然后系統通過得知整張地圖四角的坐標,計算出地圖每個像素點所對應的坐標。最后根據讀取的gps信息,找到對應的地圖,并顯示到lcd上。
16、開始 讀取地圖的基本信息根據當前gps信息找到對應的地圖并顯示 N 地圖按鍵按下 Y 修改顯示的地圖 結束圖3.5 map 類流程圖3.6 gps_diver類gps_diver類負責驅動gps模塊,gps驅動原理如下所述: GPS衛星發射兩種頻率的載波信號,即頻率為1575.42MHz的L1載波和頻率為1227.60HMz的L2載波。L1為民用頻率,L2為軍用。民用GPS信號調試成C/A碼發送,C/A碼又被稱為粗捕獲碼,是1MHz的偽隨機噪聲碼(PRN碼),其碼長為1023位(周期為1ms)。用戶機接受到C/A碼后,通過gps接受器,解調為發送次C/A碼的衛星時間。并通過多個衛星發送的C/A
17、碼時間差(至少3個),來確定當前位置。并以串口的形式把經緯度數據發送給上位機。 開始 設置串口屬性,訪問gps模塊設置gps時鐘 驅動gps模塊計算經緯度坐標值結束圖3.6 gps_driver類流程圖 3.7 staSNR類StaSnR類負責對檢測衛星數量,并告知gps_driver類。 開始 檢測衛星數量 N 衛星數量3?Y 結束圖3.7 strSNR類流程圖 3.8 debugPDF類debugPDF類負責提供調試信息,錯誤編號等內容。調試程序時,配合linux中gdb命令。能實現斷點調試、逐步調試等功能并顯示對應的錯誤信息。定義如下:#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:正常工作的,能顯示工作運行主流程er
19、ror exit fatal show it2:更進一顯示信息3:完全跟蹤!3.9 Makefile文件Makefile文件為整個工程的管理文件 ,作用是連接各個頭文件、c文件,最終編譯成可執行文件。由于使用qt開發環境,程序可以在x86平臺上與arm平臺上分別運行。只需要修改Makefile文件中的編譯期即可。3.10 地圖文件(mapinfo.txt 文件)地圖文件由一大張成都市區地圖分割成許多小地圖。Map.cfg文件里包含了整張地圖信息。mapinfo:103.831787,30.687817,104.314155,30.473525,1500,1200,300。分別代表整個地圖的左上
20、角經緯度、右下角經緯度、地圖像素的長度、地圖像素的寬度、每張地圖的像素寬度。軟件通過讀取map.cfg的內容,來獲取地圖的基本信息。地圖軟件獲取方法:采用專業地圖下載軟件 UMD(universal maps download),用戶只需在此軟件里輸入想要地圖的四角經緯度坐標。即可得到所需地圖。保證mapinfo.txtL里的地圖坐標與實際坐標一致。第4章 測試4.1 操作系統燒寫測試安裝操作系統測試的目的是搭建系統的軟件環境,便于后續工作安裝linux有如下步驟格式化nand flash安裝bootloader安裝內核文件安裝文件系統如下圖所示圖4.1.1 燒寫操作系統-vivi界面安裝好操
21、作系統后,重啟系統,將出現如下畫面。 圖 4.1.2 操作系統啟動畫面系統燒寫成功4.2 衛星接收測試衛星接收測試的目的是檢測接收到衛星的數量,以便在接收到相同衛星的情況下,檢測gps信號。測試位置:四川省成都市。第一次測試:位置室內 衛星數量 0 如下圖: 圖 4.2.1 第一次衛星接收測試第二次測試:位置室外空曠地帶 衛星數量 7 如下圖: 圖 4.2.2 第二次衛星接收測試第三次測試:位置街道 衛星數量 6 如下圖:圖 4.2.3 第三次衛星接收測試經測試,在室內不能接收到衛星的gps信號。故此系統只能在戶外使用。4.3 地圖顯示測試地圖顯示測試的目的是測試載入地圖的正誤、驗證地圖上下左
22、右移動的功能。第一次測試: 能實現上下左右移動,顯示地圖如下圖: 圖 4.3.1第一次地圖顯示測試第二次測試:能實現上下左右移動,顯示地圖如下圖: 圖 4.3.2 第二次地圖顯示測試第三次測試:能實現上下左右移動,顯示地圖如下圖: 圖 4.3.3 第三次地圖顯示測試 經測試地圖能準確的載入,并能實現上下左右移動的功能4.4 gps信號檢測測試 Gps信號測試的目的是測試gps信號的精確度,測試數據列于表3中。表3 gps數據測量表測試次數(次)第一次第二次第三次顯示經緯度東經:30.797415北緯:106.080517東經:30.813544北緯: 106.09684 東經:30.80453
23、4北緯:106.08542 實際經緯度東經:30.797367北緯:106.080235 東經:30.797415北緯:106.09851 東經:30.797415北緯:106.08846誤差計算 0.013 0.012 0.0011%從上表可以看出,gps數據精確度較高,誤差都在0.01%左右4.5 功耗測試測試環境:戶外系統使用硬件:gps模塊、sd卡、液晶屏測試次數(次)第一次第二次第三次電流 300毫安 350 毫安 320毫安電壓 3.32V 3.31V 2.95V功耗 0.99W 1.15W 0.94W從上表可看出,系統功耗在1w左右。能滿足設計技術指標。4.6 其他測試1)地圖路
24、徑變更測試 。 功能實現,測試通過2)gps串口波特率設置。 功能實現,測試通過 4.7 測試結果分析由以上的測試數據可以看出:本GPS導航系統能很好地實現題目要求的各項功能。測試期間運行穩定,基本達到了設計要求。5 總結本系統成功的模擬了個人手持gps導航系統。用戶通過點擊觸摸屏幕、方便的使用軟件。實現了地圖的顯示、拖動;gps信息、衛星數量的顯示;地圖路徑的更改;gps波特率的更改的功能。系統低功耗、高處理速度、操作簡易、界面有好。已具有一定的實用價值。通過這次畢業設計,我在更加牢固、靈活地掌握了所學的專業知識的同時。大量學習了嵌入式方面的相關知識:arm體系結構、操作系統、c+編程、sh
25、ell編程、硬件驅動程序。參考文獻:1 杜春雷 ARM體系結構與編程 清華大學出版社 2003-08-12 2 c+語言程序設計(第三版) 鄭莉 董淵 張瑞豐 編著 清華大學出版社 2001-10-113 嵌入式系統開發 齊宇 徐俊 編著 人民郵電出版社 2005-06-054 美Douglas Boling 嵌入式linux編程 北京科彥科技發展公司 譯 北京大學出版社 2003-03-125 張洪斌 QT編程指南 電子科技大學出版社 2006-06-126 李先力 文蒼茂 GPS原理及應用清華大小而出版社 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開發技術 電子工業出版社2003-03-189周鳴爭 嵌入式系統與應用 中國鐵道出版社 2011-03-12致謝至此,我的課程設計已經基本完成。回想過
27、去的點點滴滴,如果沒有學校、學院、老師、同學的關心和幫助,我也無法按期完成這令我滿意的課程設計。在此,我首先感謝學校和學院為我提供優越的實驗場所和器材,使我能夠更加方便、順利地進行作品設計與調試,減少了設計時間;其次,我要感謝指導老師鮑廣喜老師在百忙之中抽出時間同我一起探討系統構架和軟件的編寫,并不厭其煩地替我提供資料,給我了莫大的幫助,并使我學到了很多東西。鮑老師嚴謹負責的治學態度,給我留下了深刻的印象,將使我終身受益。我再次對鮑老師這學期對我的關心和幫助表示最誠摯的謝意;最后,向在整個課程設計過程中關心和幫助過我的其他老師和同學致謝。附錄:附錄1:測試儀器表7 測試儀器設備清單序號型號、名
28、稱用途數量1PC機編譯程序12UT33D 數字萬用表測量各電路工作情況13Gps導航儀測試顯示的gps正誤14vm虛擬機測試操作系統15成都、南充市區地圖測試顯示地圖正誤26精密電流、電壓表測試系統功耗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);/=設置好衛星信號強度數據!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位異或包括,的運算,但不包括$ 及 * 定義符號的運算。 最后的兩位是檢驗碼的hex(16進制)轉成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;/保證是環狀的FIFO。 PDF(2,buffer fulln);return -1; priv-bufferpriv-w_idx = data; priv-w_idx = (priv-w_idx + 1) % BUFSIZE;/保證是環狀的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;/保證是環狀的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;/取整數部分ffx=fi-ffz;/取小數部分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 并不能由空值來輸入浮點數。 / 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 的返回值,可能會失敗,如果小于要收得的數目。if(igps_sw=V; CMDBUF_Init(&buf);return 3;/轉換成度制,而不是度,分,十進制分形式。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 并不能由空值來輸入浮點數。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 的返回值,可能會失敗,如果小于要收得的數目。GPGSV_Analysis(mpGPS_GPGSV);/存入數據中!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); / 讀取串口當前屬性 i=tcgetattr(fd , &attr); if(i!=0) printf(error for get attr!n);return -1; /=設置好波特率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/=經緯值#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 的返回值,可能會失敗,如果小于要收得的數目。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;/左上點經度 小數度數制 A_lati=30.5360;/左上點緯度 B_lont=114.3684;/右下點經度 B_lati=30.521867;/右下點緯度Width=1080;/像素的 Height=978; subWidth=300;/分割時,子圖的尺寸*/=設置好地圖路徑QStrmappath=/home/map;mapPath=QStrmappath.latin1();readMapCfg(QStrmappa
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- DB32/T 3791-2020口罩用熔噴法非織造布生產技術規程
- DB32/T 3762.10-2020新型冠狀病毒檢測技術規范第10部分:微量血清中和試驗
- DB32/T 3761.22-2020新型冠狀病毒肺炎疫情防控技術規范第22部分:城鎮污水處理廠
- DB32/T 3636-2019車用汽油中甲縮醛含量的測定多維氣相色譜法
- DB32/T 3552-2019膠輪有軌電車交通系統設計規范
- DB32/T 3219-2017高速公路擴建工程技術標準
- DB31/T 988-2016小白菜生產技術規范
- DB31/T 618-2022電網電能計量裝置配置技術規范
- DB31/T 572-2012網絡游戲行業服務規范
- DB31/T 407-2015噴墨打印機用再制造噴墨盒技術規范
- 浙江省杭州市濱江區2022-2023學年七年級下學期期末語文試卷(含答案)
- 誠信教育主題班會
- 成都醫學院輔導員考試真題2022
- 氯磺化聚乙烯生產工藝技術
- 桐廬縣2023年三下數學期末綜合測試試題含解析
- 裝飾施工階段安全檢查表完整
- 數值課件第章非線性方程求根
- TEC-5600除顫操作培訓
- 蘇科版二年級下冊勞動第7課《做皮影》課件
- 芯片手冊盛科sdk用戶開發指南
- SH/T 0659-1998瓦斯油中飽和烴餾分的烴類測定法(質譜法)
評論
0/150
提交評論