應(yīng)玉明
(金華職業(yè)技術(shù)學(xué)院,浙江金華 321017)
0 引言
隨著城市交通堵塞問(wèn)題日益嚴(yán)重,城市軌道交通就成為國(guó)內(nèi)外解決交通堵塞問(wèn)題的有效途徑。為了提高城市軌道交通中車載定位的精度和可靠度,各種車載GPS 導(dǎo)航系統(tǒng)應(yīng)運(yùn)而生。目前的全球定位系統(tǒng)有我國(guó)自主研制的北斗導(dǎo)航系統(tǒng),俄羅斯的GLONASS 系統(tǒng),歐洲的伽利略系統(tǒng)和美國(guó)的GPS 系統(tǒng)。由于美國(guó)的GPS 系統(tǒng)發(fā)展比較早,技術(shù)比較成熟,可靠性高,誤差小,在嵌入式領(lǐng)域,使用也較為普遍。
使用MINIGUI 開(kāi)發(fā)的導(dǎo)航系統(tǒng)在市面上比較少見(jiàn)。MINIGUI 是由北京飛漫軟件技術(shù)有限公司開(kāi)發(fā)的、國(guó)內(nèi)為數(shù)不多的國(guó)際知名自由軟件之一,于1998年底由魏永明先生主持和開(kāi)發(fā),經(jīng)歷十幾年的應(yīng)用,已經(jīng)非常成熟和穩(wěn)定,并在許多實(shí)際產(chǎn)品或項(xiàng)目中得到了廣泛的應(yīng)用,包括數(shù)字機(jī)頂盒、電力、通訊、醫(yī)療、工控等領(lǐng)域,它還可以運(yùn)行在多個(gè)Linux 操作平臺(tái)之上,如uCliunx 、Vxworks、uC/OS-II、OSE 等,也可以運(yùn)行在Windows操作系統(tǒng)之上。
1 系統(tǒng)的功能及結(jié)構(gòu)
1.1 系統(tǒng)的功能
本系統(tǒng)采用ARM平臺(tái),使用MINIGUI進(jìn)行嵌入式圖形開(kāi)發(fā),實(shí)現(xiàn)GPS 導(dǎo)航。系統(tǒng)能方便查詢當(dāng)前行駛的經(jīng)度、緯度、行駛速度、當(dāng)前時(shí)間及相關(guān)報(bào)警信息等。
1.2 結(jié)構(gòu)
圖1 所示為本系統(tǒng)結(jié)構(gòu)圖,它由ARM 開(kāi)發(fā)板、顯示模塊、電源模塊和GPS 模塊組成。GPS模塊主要由串口通信、GPS 數(shù)據(jù)處理、讀取數(shù)據(jù)、存入數(shù)據(jù)、數(shù)據(jù)提取、數(shù)據(jù)處理等組成。
1.2.1 串口通信

圖1 系統(tǒng)結(jié)構(gòu)圖
本系統(tǒng)采用的是RS-232異步通信串口,主要解決了計(jì)算機(jī)經(jīng)串口連接通信設(shè)備(主要是Modem),以串行二進(jìn)制比特位流的形式與外界進(jìn)行數(shù)據(jù)交換的問(wèn)題,核心是數(shù)據(jù)終端設(shè)備DTE(計(jì)算機(jī))與數(shù)據(jù)通信設(shè)備DCE(Modem)之間的接口問(wèn)題,總共設(shè)計(jì)了14種接口類型,能提供全雙工的通信方式。
1.2.2 GPS數(shù)據(jù)處理
采用CC50-BG聯(lián)星公司的芯片,該芯片提供了多種格式的數(shù)據(jù),這些不同格式的數(shù)據(jù)中包含了經(jīng)緯度、時(shí)間、速度、日期、海拔高度、偏轉(zhuǎn)角度、信噪比、接受狀態(tài)燈信息等。采用解碼的是GPRMC格式的數(shù)據(jù)。解碼GPS數(shù)據(jù)分為幾個(gè)過(guò)程:讀取數(shù)據(jù)、存入數(shù)據(jù)、提取數(shù)據(jù)、處理數(shù)據(jù)、保存數(shù)據(jù)、清空緩存。
1.2.2.1 讀取數(shù)據(jù)
系統(tǒng)通過(guò)串口采集的數(shù)據(jù),利用read(fd,buffer,1)函數(shù),從緩存中讀取一個(gè)字節(jié)的數(shù)據(jù);讀取的數(shù)據(jù)有些緩慢,便于同時(shí)完成一條數(shù)據(jù)的存入,每一段數(shù)據(jù)是以“$”開(kāi)頭,以“
”結(jié)尾。
1.2.2.2 存入數(shù)據(jù)
利用strcat(dest,buffer)函數(shù)把每次讀到的一個(gè)字節(jié)的數(shù)據(jù)進(jìn)行拼接起來(lái),直到遇到“
”結(jié)束。
1.2.2.3 數(shù)據(jù)提取
讀取一條完整數(shù)據(jù)后,通過(guò)調(diào)用strncmp(dest,array,6)函數(shù)比較是否為所需數(shù)據(jù),其中array數(shù)據(jù)存放提取格式數(shù)據(jù)($GPRMC)。若是,則跳到該格式數(shù)據(jù)處理函數(shù)進(jìn)行處理;若不是,則清空dest緩存里的數(shù)據(jù),進(jìn)行下一次的數(shù)據(jù)存儲(chǔ)。
1.2.2.4 處理數(shù)據(jù)
當(dāng)確定該數(shù)據(jù)是所需數(shù)據(jù)時(shí),通過(guò)strlen函數(shù)計(jì)算出dest 數(shù)據(jù)長(zhǎng)度,再把數(shù)據(jù)一個(gè)個(gè)送入到處理函數(shù),這里定義了一個(gè)SectionID 變量,統(tǒng)計(jì)逗號(hào)個(gè)數(shù),因?yàn)槊慷螖?shù)據(jù)都是以逗號(hào)結(jié)束的,當(dāng)統(tǒng)計(jì)到第一個(gè)逗號(hào)的時(shí)候開(kāi)始處理第一段的數(shù)據(jù)內(nèi)容,把數(shù)據(jù)按需要的長(zhǎng)度存入到定義的結(jié)構(gòu)體中,并且在每次處理結(jié)束加上’