任海波,韓崇偉,李 碩,陳曉明
(西北機電工程研究所,陜西咸陽 712099)
自行火炮的定位定向裝置由GPS衛(wèi)星導(dǎo)航裝置和慣性定位定向?qū)Ш窖b置組成,需分別通過RS-232串口對其進行數(shù)據(jù)采集。在只需對單個串口操作時,利用MSComm控件會使編程快捷簡單,然而,由于MSComm控件做了大量的封裝,在多線程串口編程時降低了編程的可控性和靈活性[1]。CSerialPort類是由Remon Spekreijse提供的免費串口類,本文成功的采用CSerialPort類進行了串口編程,該方法具有編程效率高,程序可控性強,擴展性好,容易實現(xiàn)多線程串口通信的優(yōu)點。
CSerialPort類是基于多線程的,其工作流程如下:首先設(shè)置好串口參數(shù),再打開串口監(jiān)測工作線程,串口監(jiān)測工作線程監(jiān)測到串口接收到的數(shù)據(jù)、流控制事件或其他串口事件后,就以消息方式通知主程序,激發(fā)消息處理函數(shù)來進行數(shù)據(jù)處理,這是對接收數(shù)據(jù)而言的;發(fā)送數(shù)據(jù)可直接向串口發(fā)送。以下介紹幾個要用到的函數(shù)[2]:
在自行火炮定位定向數(shù)據(jù)采集系統(tǒng)中,由串口通信模塊定期接收數(shù)據(jù),數(shù)據(jù)處理模塊負責(zé)把符合要求的數(shù)據(jù)進行處理后存儲到后臺數(shù)據(jù)庫,并根據(jù)需要顯示定位定向數(shù)據(jù)。此外,還可以修改系統(tǒng)參數(shù),系統(tǒng)功能結(jié)構(gòu)如圖1所示。
通過Visual C++可視化編程語言及其提供的多線程串口編程工具CSerialPort類,實現(xiàn)GPS接收機與計算機和慣導(dǎo)與計算機的串口通信。計算機與定位定向裝置進行數(shù)據(jù)傳送采用異步串行傳送方式,串口通信協(xié)議為波特率9 600 bps,8個數(shù)據(jù)位,1個停止位,無奇偶校驗。本文采用的GPS接收機的數(shù)據(jù)遵循NMEA 0183數(shù)據(jù)格式[3],采集程序只讀取GPRMC定位語句,其余的信息將被忽略。采用的慣導(dǎo)數(shù)據(jù)遵循某慣導(dǎo)自定義的報文格式,即“命令數(shù)據(jù)校驗碼”。
在VC++6.0軟件環(huán)境下建立基于對話框的應(yīng)用程序,工程名為 test。
1)添加類文件。將類文件SerialPort.h和SerialPort.cpp復(fù)制到工程所在文件夾中,然后點擊VC++6.0菜單Project->Files…,再在打開的文件選擇對話框中選擇SerialPort.h和SerialPort.cpp,點擊OK,并在testDlg.h中包含頭文件Serial-Port.h。這樣就把類文件加入了當(dāng)前工程。
2)通過CSerialPort類完成串口操作。在主對話框頭文件testDlg.h中為兩個串口分別定義CSerialPort類對象 m_SerialPort[0]和 m_SerialPort[1],再定義兩個布爾變量m_PortOpened[0]和m_PortOpened[1]用來標(biāo)志串口是否打開。完成后繼續(xù)操作[2]:
①在頭文件testDlg.h中添加函數(shù)說明
CSerialPort類所有的消息均需要人工添加消息處理函數(shù),本文只需處理 WM_COMM_RXCHAR消息就可以了。處理函數(shù)名定義為On-Comm(),在testD lg.h中串口字符接收消息的響應(yīng)函數(shù):
定位定向數(shù)據(jù)通過串口處理模塊讀入系統(tǒng),對其進行定時分析和處理,將新收到的符合協(xié)議要求的數(shù)據(jù)放人數(shù)據(jù)庫中。為此用SetTimer函數(shù)設(shè)置兩個定時器,分別按照GPS接收機和慣導(dǎo)的刷新頻率定時發(fā)送WM_TIMER消息,在OnTim er函數(shù)中響應(yīng)WM_TIM ER消息,處理數(shù)據(jù),退出系統(tǒng)時,調(diào)用K illTimer函數(shù)關(guān)閉定時器[4-5]。處理數(shù)據(jù)的方法是:
1)先分析GPS語句的結(jié)束標(biāo)志CR和LF以找出最新的GPS語句,再根據(jù)GPS數(shù)據(jù)格式規(guī)定的數(shù)據(jù)順序、位數(shù)以及數(shù)據(jù)分割符等特征提取各個字段。
2)分析慣導(dǎo)的語句格式,控制慣導(dǎo)并提取所需信息。
3)最后調(diào)用CDaoRecordSet類對象的AddNew方法將記錄存人數(shù)據(jù)庫。
代碼如下:
系統(tǒng)把接收到的定位定向數(shù)據(jù)保存在數(shù)據(jù)庫中,采用MFCDAO技術(shù)訪問數(shù)據(jù)庫。先調(diào)用CD-aoDatabase類對象的Open方法打開數(shù)據(jù)庫。然后調(diào)用CDaoRecordSet類對象的A ddNew、Edit等方法;對記錄進行操作,最后調(diào)用Close方法關(guān)閉數(shù)據(jù)庫[6-7]。代碼如下:
在Visual C++6.0軟件環(huán)境下,導(dǎo)航數(shù)據(jù)的采集界面采用以對話框為主題的界面方案。在實驗室,利用串口調(diào)試軟件發(fā)送符合NM EAO183協(xié)議的GPS數(shù)據(jù)和符合慣導(dǎo)報文格式的數(shù)據(jù)給數(shù)據(jù)采集系統(tǒng)。導(dǎo)航計算機依照GPS和慣導(dǎo)的通訊協(xié)議解析出自行火炮的導(dǎo)航數(shù)據(jù)。數(shù)據(jù)采集界面顯示了GPS和慣導(dǎo)的原始定位定向數(shù)據(jù),GPS解析后的定位結(jié)果,慣導(dǎo)解析后的定位定向結(jié)果、高程及里程等信息。
本文介紹了在VC++環(huán)境下自行火炮定位定向數(shù)據(jù)采集系統(tǒng)的設(shè)計及實現(xiàn)過程,采用CSerial-Port類進行了多線程串口編程,并應(yīng)用MFCDAO技術(shù)進行了Access數(shù)據(jù)庫編程,使訪問數(shù)據(jù)庫的效率大大提高,該方法具有編程效率高,程序可控性強,擴展性好,操作簡便等特點,具有一定的推廣應(yīng)用價值。
[1] 李一雷,張贇.基于CSerialPort類的多線程串口通信的實現(xiàn)[J].電腦知識與技術(shù),2007(9):535-537.LI Yi-lei,ZHANG Yun.The Imp lementation of mu ltithreading on serial communication based on CSerial-Port class[J].Computer Know ledge and Technology,2007(9):535-537.(in Chinese)
[2] 龔建偉,熊光明.Visual C++/Turbo C串口通信編程實踐[M].2版.北京:電子工業(yè)出版社,2008:27-62.GONG Jian-wei,XIONG Guang-ming.Programm ing practice of the serial port communication w ith visual C++/Turbo C[M].2nd ed.Beijing:Publishing House o f Electronics Industry,2008:27-62.(in Chinese)
[3] 王曉東.基于VC++的GPS數(shù)據(jù)采集系統(tǒng)的設(shè)計與實現(xiàn)[J].湖北汽車工業(yè)學(xué)院學(xué)報,2006,20(2):46-49.W ANG Xiao-dong.Design and im plementation of GPS data acquisition system based on VC++[J].Journal o f Hubei Automotive Industries Institute,2006,20(2):46-49.(in Chinese)
[4] 胡輝.GPS數(shù)據(jù)采集軟件的實現(xiàn)[J].全球定位系統(tǒng),2008.1:25-30.HU H ui.The Achievement o f GPS data-acquisition so ftware[J].GNSSW orld of China,2008(1):25-30.(in Chinese)
[5] 郭念,龐子龍.基于VB實現(xiàn)GPS數(shù)據(jù)采集與處理[J].電腦知識與技術(shù),2009.5(1):11-12.GUO N ian,PANG Zi-long.GPS data acquisition and processing based on VB[J].Computer Know ledge and Technology,2009,5(1):11-12.(in Chinese)
[6] 顏志軍.V isual C++數(shù)據(jù)庫開發(fā)典型模塊與實例精講[M].北京:電子工業(yè)出版社,2007:71-83.YAN Zhi-jun.Analysis on typicalmodels and examples in developing the visual C++database[M].Beijing:Publishing H ouse of Electronics Industry,2007:71-83.(in Chinese)
[7] 馬飛,諸昌鈐.利用VC++實現(xiàn)GPS數(shù)據(jù)采集[J].計算機時代,2005,6:13-15.M A Fei,CHU Chang-qian.GPS data acquisition based on VC++[J].Computer Era,2005(6):13-15.(in Chinese)