宋園方
提要本文介紹了Window CE串口讀寫以及GPS報文解析。闡述了串口讀寫數(shù)據(jù)的實現(xiàn)過程,并以GPRMC報文為例,說明從報文中提取有效數(shù)據(jù)的過程。
關(guān)鍵詞:嵌入式系統(tǒng);GPS報文;串口;Windows CE
中圖分類號:F49文獻(xiàn)標(biāo)識碼:A
嵌入式系統(tǒng)因為其擁有與應(yīng)用緊密結(jié)合、系統(tǒng)體積小能夠隨意裁剪、實時處理的特點,現(xiàn)已成為生活、工業(yè)、服務(wù)業(yè)、消費電子各領(lǐng)域中不可或缺的一部分。嵌入式系統(tǒng)家族中成員不少,杰出的代表產(chǎn)品有VxWork、Linux、Windows CE等。其中,Windows CE出自微軟,因為其繼承了Windows的系統(tǒng)與應(yīng)用程序相分離的特點,在嵌入式系統(tǒng)領(lǐng)域中搶占先機,獨領(lǐng)風(fēng)騷。GPS全球衛(wèi)星定位系統(tǒng),由美國國防部研制,具有在海、陸、空進行全方位實時三維導(dǎo)航與定位能力的新一代衛(wèi)星導(dǎo)航與定位系統(tǒng)。隨著全球定位系統(tǒng)的不斷改進,硬軟件的不斷完善,應(yīng)用領(lǐng)域不斷地開拓,目前已遍及國民經(jīng)濟各部門,并開始逐步深入人們的日常生活。本文通過介紹Windows CE串口應(yīng)用程序的實現(xiàn)以及GPS數(shù)據(jù)報文格式解析,實現(xiàn)了基于Windows CE的GPS應(yīng)用。
一、基于Windows CE串口程序設(shè)計
因為串性傳輸受干擾小、傳輸速度快的優(yōu)點,被大量應(yīng)用到各種外設(shè)與CPU之間的通信上,所以,目前主流的GPS芯片與CPU之間也是采用串口通信的。Windows CE已經(jīng)為開發(fā)者提供了現(xiàn)成的API。Windows CE中用于打開串口的API 函數(shù)為CreateFile,其原型為:
HANDLE CreateFile (
LPCTSTR lpFileName,//將要打開的串口邏輯名,如COM1 或COM2
DWORD dwAccess,//指定串口訪問的類型,可以是讀取、寫入或兩者并列
DWORD dwShareMode,//指定共享屬性,由于串口不能共享,該參數(shù)必須置為0
LPSECURITY_ATTRIBUTES lpsa,//引用安全性屬性結(jié)構(gòu),缺省值為NULL
DWORD dwCreate,//創(chuàng)建標(biāo)志,對串口操作該參數(shù)必須置為OPEN EXISTING
DWORD dwAttrsAndFlags,//屬性描述,用于指定該串口是否可進行異步操作
HANDLE hTemplateFile//指向模板文件的句柄,對串口而言該參數(shù)必須置為NULL
);
讀串口的API為ReadFile,其原型為:
BOOL ReadFile(
HANDLE hFile,//要讀串口的句柄
LPVOID lpBuffer,//接收數(shù)據(jù)buffer 的指針
DWORD nNumberOfBytesToRead,//讀取數(shù)據(jù)的字節(jié)數(shù)
LPDWORD lpNumberOfBytesRead,//實際讀取數(shù)據(jù)的字節(jié)數(shù)
LPOVERLAPPED lpOverlapped //重疊操作時該參數(shù)指向一個OVERLAPPED結(jié)構(gòu),同步操作時該參數(shù)為NULL
);
打開串口后,需要對串口進行一些初始化配置工作。這需要通過一個DCB結(jié)構(gòu)來進行。DCB結(jié)構(gòu)包含了諸如波特率、數(shù)據(jù)位數(shù)、奇偶校驗和停止位數(shù)等信息。在查詢或配置串口的屬性時,都要用DCB結(jié)構(gòu)來作為緩沖區(qū)。一般用CreateFile打開串口后,可以調(diào)用GetCommState函數(shù)來獲取串口的初始配置。要修改串口的配置,應(yīng)該先修改DCB結(jié)構(gòu),然后再調(diào)用SetCommState函數(shù)設(shè)置串口。
除了在BCD中的設(shè)置外,程序一般還需要設(shè)置I/O緩沖區(qū)的大小和超時。Windows CE同Windows系統(tǒng)一樣,用I/O緩沖區(qū)來暫時存放串口輸入和輸出的數(shù)據(jù)。調(diào)用SetupComm函數(shù)可以設(shè)置串行口的輸入和輸出緩沖區(qū)的大小。
在讀寫串口時,由于硬件或是緩存等問題,會出現(xiàn)超時現(xiàn)象。在串口程序設(shè)計時,要有相應(yīng)的處理。超時設(shè)置的作用是在規(guī)定的時間內(nèi)沒有讀入或發(fā)送出指定數(shù)量的字符,則讀或?qū)懙牟僮鲿K止??梢杂肎etCommTimeouts函數(shù)查詢當(dāng)前的超時設(shè)置,該函數(shù)會填充一個COMMTIMEOUTS結(jié)構(gòu)。調(diào)用SetCommTimeouts可以用某一個COMMTIMEOUTS結(jié)構(gòu)的內(nèi)容來設(shè)置超時。
從串口讀出數(shù)據(jù)后,我們就可以對GPS數(shù)據(jù)報文進行解析了。
二、GPS報文解析
GPS的數(shù)據(jù)有多種報文格式,分別有GPRMC、GPGSV、GPGSA、GPGGA。GPR-
MC為推薦定位信息,GPGSV為可視衛(wèi)星狀態(tài)輸出語句,GPGSA為GPS精度指針及使用衛(wèi)星格式GPGGA為GPS固定數(shù)據(jù)輸出語句。
報文數(shù)據(jù)中有些數(shù)據(jù)是重復(fù)的,在解析GPS報文的時候,沒有必要將所有的報文都解析,根據(jù)應(yīng)用的需要,只解析所需數(shù)據(jù)即可。如本文涉及到的應(yīng)用只需要經(jīng)度、緯度,所以,我們只解析GPRMC報文就足夠了。如下是GPRMC報文數(shù)據(jù)格式和描述。其他應(yīng)用所需報文數(shù)據(jù)及其相關(guān)報文數(shù)據(jù)描述,本文不再贅述。
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>
(1)標(biāo)準(zhǔn)定位時間(UTC time)格式:時時分分秒秒.秒秒秒(hhmmss.sss)
(2)定位狀態(tài),A=數(shù)據(jù)可用,V=數(shù)據(jù)不可用
(3)緯度,格式:度度分分.分分分分(ddmm.mmmm)
(4)緯度區(qū)分,北半球(N)或南半球(S)
(5)經(jīng)度,格式:度度分分.分分分分
(6)經(jīng)度區(qū)分,東(E)半球或西(W)半球
(7)相對位移速度,0.0至1851.8knots
(8)相對位移方向,000.0至359.9度
(9)日期,格式:日日月月年年(ddmmyy)
(10)磁極變量,000.0至180.0
(11)度數(shù)
(12)Checksum.(檢查位)
因為串口收到的數(shù)據(jù)是GPS的全部報文,根據(jù)設(shè)計,我們只提取GPRMC報文。GPS報文數(shù)據(jù)是ASCⅡ碼,在應(yīng)用時,需要將其轉(zhuǎn)換成數(shù)值,便于在程序中進行運算和對比。圖1是從GPRMC報文中提取經(jīng)度、緯度的具體流程,以及處理GPRMC報文,將維度、維度區(qū)分,經(jīng)度、經(jīng)度區(qū)分,提取出來部分代碼。(圖1)
得到經(jīng)度和緯度后,可以簡單地做些應(yīng)用,但是要達(dá)到商用GPS應(yīng)用要求還需要進一步完善,如在短時間內(nèi)GPS沒有定位,則需要經(jīng)緯度推算等設(shè)計。
本文介紹了基于Windows CE串口讀取數(shù)據(jù)以及GPS報文解析的實現(xiàn)。該設(shè)計成功用于某便攜式導(dǎo)航產(chǎn)品的電子狗功能中,實現(xiàn)了系統(tǒng)根據(jù)當(dāng)前經(jīng)緯度對指定地點距離進行判斷。串口讀取GPS數(shù)據(jù)方案在嵌入式領(lǐng)域中應(yīng)用很廣泛,如車載、手持產(chǎn)品中都有應(yīng)用。Windows CE已成為嵌入式系統(tǒng)的主流,其快速、模塊化的開發(fā)方式,為開發(fā)者開發(fā)應(yīng)用程序提供了規(guī)范、快速的框架。
(作者單位:西安歐亞學(xué)院信息工程學(xué)院)
參考文獻(xiàn):
[1]周毓林,寧楊,陸貴強,付林林.Windows CE.net內(nèi)核定制及應(yīng)用開發(fā).北京:電子工業(yè)出版社,2005.2.
[2]龔建偉,熊光明.Visual C++/Turbo C串口通信編程實踐(第2版).北京:電子工業(yè)出版社,2007.9.