国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

基于MFC的純方位定位系統(tǒng)串口通訊軟件設(shè)計(jì)

2012-07-09 02:31:28胡科強(qiáng)王小寧
兵器裝備工程學(xué)報(bào) 2012年8期
關(guān)鍵詞:浮標(biāo)緩沖區(qū)指針

胡科強(qiáng),王小寧

(海軍91388 部隊(duì),廣東 湛江 524002)

串口通訊是計(jì)算機(jī)和外設(shè)進(jìn)行通訊,獲取外設(shè)采集到的監(jiān)測(cè)數(shù)據(jù)的重要手段?;贕PS 和矢量水聽(tīng)器技術(shù)的基陣式水下定位系統(tǒng)來(lái)實(shí)現(xiàn)對(duì)水下目標(biāo)定位[1]。其獨(dú)特性在于以較少水聽(tīng)器對(duì)目標(biāo)快速被動(dòng)定位,且具有良好可操作性。為保證定位基陣傳回的加入時(shí)間戳的目標(biāo)方位信息、姿態(tài)修正信息和GPS 定位信息通過(guò)串口和主控計(jì)算機(jī)之間進(jìn)行高效、可靠、準(zhǔn)確的傳輸,數(shù)據(jù)通訊軟件的設(shè)計(jì)顯得尤為重要[2]。

1 系統(tǒng)總體實(shí)現(xiàn)

基陣式水下定位系統(tǒng)工作原理示意圖如圖1 所示。主控計(jì)算機(jī)要同時(shí)采集多路(GPS 接收機(jī)、矢量水聽(tīng)器、電羅經(jīng))經(jīng)串口輸出的原始數(shù)據(jù),而主控計(jì)算機(jī)數(shù)據(jù)預(yù)處理、定位解算、數(shù)據(jù)關(guān)聯(lián)占用CPU 的時(shí)間較多。需要采用合理的軟件結(jié)構(gòu)防止串口緩沖區(qū)數(shù)據(jù)溢出、丟數(shù)、死機(jī)現(xiàn)象。提高軟件的穩(wěn)定性、可靠性和實(shí)時(shí)性。線(xiàn)程是操作系統(tǒng)的基本調(diào)度單元,可將某個(gè)工作模塊置于獨(dú)立的線(xiàn)程中。合理采用多線(xiàn)程技術(shù)可以有效地加快程序的反應(yīng)速度、提高執(zhí)行效率。如果不采用多線(xiàn)程技術(shù),只能首先接收、處理數(shù)據(jù),再進(jìn)行解算,CPU 將浪費(fèi)時(shí)間用來(lái)等待數(shù)據(jù),不能保證實(shí)時(shí)性。因此軟件中目標(biāo)解算和信息顯示做為主控制線(xiàn)程(監(jiān)控和界面線(xiàn)程),同時(shí)創(chuàng)建一個(gè)輔助線(xiàn)程負(fù)責(zé)數(shù)據(jù)接收,這樣,能最大限度的保證系統(tǒng)工作的實(shí)時(shí)性。

圖1 系統(tǒng)工作原理示意圖

2 各模塊設(shè)計(jì)

2.1 串口通信用戶(hù)層協(xié)議

浮標(biāo)端實(shí)時(shí)接收的來(lái)自矢量水聽(tīng)器、GPS 和羅經(jīng)信息,需要按照統(tǒng)一的格式從串口發(fā)送數(shù)據(jù)同時(shí)將接收的數(shù)據(jù)中將需要的信息提取出來(lái),在此采用NMEA-0183 無(wú)線(xiàn)通信協(xié)議,該協(xié)議包含了幀頭、幀尾、幀內(nèi)數(shù)據(jù)、校驗(yàn)、換行,幀內(nèi)數(shù)據(jù)之間用逗號(hào)分隔[3]。將浮標(biāo)各部分?jǐn)?shù)據(jù)通過(guò)組幀程序打包成該協(xié)議格式后采用十六進(jìn)制傳送出去。

基站端從串口接收數(shù)據(jù)并將其放置于緩存,在沒(méi)有進(jìn)一步處理前在緩存中是一串字節(jié)流,在通過(guò)解幀程序?qū)⒏髯侄蔚男畔⑻崛〕鰜?lái)。制定通信協(xié)議時(shí)須考慮通信系統(tǒng)的數(shù)據(jù)吞吐量。終端站實(shí)時(shí)傳送的參數(shù)包括GPS 接收機(jī)給出的終端站自身的定位信息:經(jīng)度、緯度、導(dǎo)航狀態(tài);狀態(tài)參數(shù)包括通信狀態(tài),數(shù)據(jù)存儲(chǔ)器被占用的情況;水聲處理模塊提供的目標(biāo)聲學(xué)數(shù)據(jù),這部分?jǐn)?shù)據(jù)占用了大部分?jǐn)?shù)據(jù)空間這些數(shù)據(jù)將被打包以幀的形式傳送給控制器??紤]到目標(biāo)個(gè)數(shù)及脈沖數(shù)目的不確定性,用B 表示單個(gè)浮標(biāo)基元在一個(gè)通信周期內(nèi)需要傳送的bit 數(shù),在每同步周期的數(shù)據(jù)包中加入以下信息:

B≥數(shù)據(jù)幀同步頭+數(shù)據(jù)總長(zhǎng)度+浮標(biāo)ID 號(hào)+浮標(biāo)位置數(shù)據(jù)+浮標(biāo)狀態(tài)數(shù)據(jù)+(目標(biāo)ID 號(hào)+目標(biāo)方位數(shù)據(jù)+測(cè)試狀態(tài)數(shù)據(jù))×目標(biāo)個(gè)數(shù)。

其中:數(shù)據(jù)幀同步頭:16 bit;數(shù)據(jù)總長(zhǎng)度:8 bit;浮標(biāo)ID號(hào):2 bit;浮標(biāo)位置數(shù)據(jù):經(jīng)度32 bit +緯度32 bit =64 bit;浮標(biāo)狀態(tài)數(shù)據(jù):1 bit(GPS 定位狀態(tài));目標(biāo)ID 號(hào):3 bit(目標(biāo)最大跟蹤數(shù):8 個(gè));目標(biāo)方位數(shù)據(jù):16bit;測(cè)試狀態(tài)數(shù)據(jù):4 bit(表明浮標(biāo)基元對(duì)目標(biāo)的檢測(cè)能力)。

這樣,以上數(shù)據(jù)均考慮了系統(tǒng)進(jìn)一步擴(kuò)展的要求,以最大值計(jì)算,假設(shè)浮標(biāo)基元數(shù)量M 為3 個(gè),通信接力N 為3 次,每幀聲學(xué)數(shù)據(jù)最多為B×M ×N =2 475 bps。選用的GD230電臺(tái)數(shù)據(jù),其傳輸碼速率在9 600 ~19 200 bps,發(fā)射功率為0.1 ~8 W,誤碼率小于10-5,在通信碼速率、通信距離、功耗以及抗干擾性等方面均可以滿(mǎn)足水下定位跟蹤系統(tǒng)的需要。

對(duì)數(shù)據(jù)幀邊接收邊處理,當(dāng)串口緩沖區(qū)中的字符觸發(fā)串口通信事件,驅(qū)動(dòng)串口通信處理函數(shù),對(duì)接收到的數(shù)據(jù)幀進(jìn)行處理如圖2 所示。

采用時(shí)分多址協(xié)議,實(shí)時(shí)工作狀態(tài)下采用基站輪詢(xún),集中控制動(dòng)態(tài)分配時(shí)隙的方式,利用簡(jiǎn)化的停等ARQ 方式實(shí)現(xiàn)差錯(cuò)控制:

1)基站向浮標(biāo)發(fā)完數(shù)據(jù)幀后,啟動(dòng)定時(shí)器,若在設(shè)定的時(shí)間內(nèi)未收到浮標(biāo)傳回?cái)?shù)據(jù)幀,則將該浮標(biāo)存入誤傳表;

2)繼續(xù)呼叫另一浮標(biāo);

3)從誤傳表中取出浮標(biāo)MAC 地址并呼叫,令其重傳上一數(shù)據(jù)幀,過(guò)程同1、2,將錯(cuò)誤的浮標(biāo)地址存入誤傳表;

4)重復(fù)1)-3),最多3 次。

圖2 接收數(shù)據(jù)處理協(xié)議

2.2 基于API 的多線(xiàn)程串口通信

利用Win32 操作系統(tǒng)具有的多線(xiàn)程、消息響應(yīng)和通信事件驅(qū)動(dòng)等機(jī)制,采用Win32 中對(duì)串口進(jìn)行異步操作的API 函數(shù),編寫(xiě)實(shí)時(shí)高效的串行通信程序[4]。

主控軟件必須具有多任務(wù)并行處理能力,典型情況為當(dāng)系統(tǒng)進(jìn)入目標(biāo)跟蹤狀態(tài)時(shí),主控軟件要同時(shí)處理串口數(shù)據(jù),實(shí)時(shí)解算目標(biāo)位置,接受指揮人員的控制指令。為了使系統(tǒng)軟件能在Windows 環(huán)境下多任務(wù)并行處理,采用多線(xiàn)程來(lái)實(shí)現(xiàn)多任務(wù)控制[5-6]。

MFC 應(yīng)用程序的線(xiàn)程由CWinThread 對(duì)象表示,分為主線(xiàn)程如圖3 所示和工作者線(xiàn)程如圖4 所示,前者能提供界面和用戶(hù)交互,用于處理用戶(hù)輸入并對(duì)各事件和消息進(jìn)行響應(yīng);后者主要用于處理程序的后臺(tái)任務(wù),即負(fù)責(zé)實(shí)時(shí)數(shù)據(jù)的不間斷接收。

使用Win32API 函數(shù)進(jìn)行串口通信編程,調(diào)用AfxBeginThread()自動(dòng)創(chuàng)建CWinThread 對(duì)象,開(kāi)始一個(gè)進(jìn)程,VC++通過(guò)事件對(duì)象來(lái)實(shí)現(xiàn)線(xiàn)程同步。使用ClearCommError函數(shù)查詢(xún)輸入緩沖區(qū)是否有字符,如果有,發(fā)送消息通知接受處理函數(shù);如果沒(méi)有,則調(diào)用WaitCommEvent 函數(shù)監(jiān)視EV_RXCHAR 通信事件,執(zhí)行I/O 重疊操作,隨即調(diào)用GetOverlappedResult 函數(shù)無(wú)限等待通信事件,直到EV_RXCHAR 事件發(fā)生,則結(jié)束等待。如果只用ClearCommError 函數(shù),工作者線(xiàn)程將不斷耗費(fèi)CPU 時(shí)間來(lái)進(jìn)行查詢(xún),效率較低;如果只用WaitCommEvent 函數(shù)監(jiān)視,對(duì)緩沖區(qū)已有字符將不會(huì)產(chǎn)生EV_RXCHAR 事件,易造成數(shù)據(jù)延誤和丟失。兩方法聯(lián)合使用兼顧效率和可靠性。

while (pDoc- >m_hConnected){

//當(dāng)串口已連接,執(zhí)行下面程序

PurgeComm(pDoc - >m_hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT);

for(;;){//無(wú)限循環(huán),直到關(guān)閉線(xiàn)程

bResult = WaitCommEvent(pDoc - >m_hCom,&Event,&port- >m_ov);

if(!bResult){

switch (GetLastError()){

case ERROR_IO_PENDING{

break ;}

default ;{

break ;}}}

else {

bResult = ClearCommError (pDoc - > m _ hCom,&dwErrorFlag,&ComStat);

if(ComStat.cbInQue= =0)//緩沖區(qū)無(wú)數(shù)據(jù)

continue ;}

//無(wú)限等待,阻礙該線(xiàn)程,直到等待的事件到來(lái)。

//等待的事件有:

m_hEventArray[0]=m_ShutdownEvent;

m_hEventArray[1]=m_ov.hEvent;

Event=WaitForSingleObject(pDoc - >m_hPostMsgEvent,INFINITE);

ResetEvent(pDoc- >m_hPostMsgEvent);//通知視圖

switch (Event){

case WAIT_OBJECT_0;{//關(guān)閉串口事件

AfxEndThread(100);

break ;}

case WAIT_OBJECT_1;{//讀事件

GetCommMask(port- >m_hCom,&CommEvent);

if (CommEvent&EV_RXCHAR){

//接收到數(shù)據(jù)

port- >ReadFromPort(); //讀串口

CMyProtocol::run();//通信協(xié)議PostMessage(pDoc- >m_hTermWnd,CM_RECEIVE,0,(LPARAM)EV_RXCHAR);//向主窗體發(fā)送處理串口事件的命令

break ;}}}//close forever loop

closeHandle(m_ov.hEvent);

return 0;}}

圖3 主程序流程

圖4 工作者線(xiàn)程流程

2.3 串口通信類(lèi)設(shè)計(jì)

串口類(lèi)封裝了系統(tǒng)對(duì)串口的所有公共操作。

class CComm{

private

CCirQueue m_CirQueue; //循環(huán)隊(duì)列對(duì)象,用來(lái)緩存接受的數(shù)據(jù)。

HANDLE m_hShutdownEvent; //關(guān)閉事件句柄,用于在關(guān)閉程序時(shí)關(guān)閉線(xiàn)程。

CWinThread* m_Thread; //線(xiàn)程指針,指向監(jiān)視該串口的線(xiàn)程。

CWnd * pWnd;//該串口對(duì)應(yīng)的窗體指針

public

BOOL InitPort(CWnd* pWnd,int PortID,int BandRate);//串口初始化函數(shù)

void ReadFromPort();//串口讀函數(shù)

void WriteToPort(unsigned char * ch,int num);//串口寫(xiě)函數(shù)

void ProcessCommand();//數(shù)據(jù)處理函數(shù)

static UNIT WatchComm(LPVOID pParam);//串口監(jiān)視

public

CComm();//構(gòu)造函數(shù)

virtual ~CComm();};//析構(gòu)函數(shù)

環(huán)形隊(duì)列類(lèi)CCirQue:

環(huán)形緩沖區(qū)需要有一個(gè)讀指針(位置)和寫(xiě)指針(位置)。其中讀指針由讀數(shù)據(jù)接口來(lái)移動(dòng),寫(xiě)指針由寫(xiě)數(shù)據(jù)接口來(lái)移動(dòng)。在讀出和寫(xiě)入數(shù)據(jù)時(shí),要分別考慮 讀指針超前與滯后寫(xiě)指針2 種情況。該類(lèi)封裝了一個(gè)環(huán)形隊(duì)列,定義一個(gè)緩沖區(qū)(該緩沖區(qū)把該數(shù)組看作是一個(gè)環(huán),支持在一塊固定的數(shù)組上的無(wú)限次讀和寫(xiě),數(shù)組的大小不會(huì)自動(dòng)變化)用于暫時(shí)存取主控計(jì)算機(jī)通過(guò)串口采集到的數(shù)據(jù)。又定義了對(duì)該緩沖區(qū)的一些操作,如GetCount()(獲得隊(duì)列中的元素個(gè)數(shù)),IsFull()判斷隊(duì)列是否滿(mǎn)。

Class CCirQue{

public

bool IsEmpty();//判斷隊(duì)列是否空

unsigned char GetQueue();//獲得隊(duì)首元素

unsigned char DeQueue();//提取隊(duì)首元素

void EnQueue(unsigned char ch);//向隊(duì)列中插入元素

CCirQue();

Virtual ~CCirQue();

CCritialSection m_buffCriSect;//循環(huán)隊(duì)列臨界區(qū)

};

在對(duì)緩沖區(qū)的所有操作都用到臨界區(qū)CCritialSection 類(lèi)和Clock 類(lèi)來(lái)保證串口通信同步的要求。

3 結(jié)束語(yǔ)

結(jié)合基陣式水下定位系統(tǒng)數(shù)據(jù)采集的需求,對(duì)多線(xiàn)程、串口通信、異步I/O、通信用戶(hù)協(xié)議技術(shù)原理和實(shí)現(xiàn)方法進(jìn)行分析探討,并為通信系統(tǒng)封裝了串口類(lèi)和環(huán)形緩沖類(lèi),它們功能強(qiáng)大,具有較好的移植性和控制靈活性。實(shí)際應(yīng)用表明多線(xiàn)程技術(shù)應(yīng)用于串口通信,可以提高程序的執(zhí)行效率,使程序并行工作。用戶(hù)在進(jìn)行費(fèi)時(shí)的I/O 操作、實(shí)時(shí)解算的同時(shí)也可以進(jìn)行用戶(hù)需求響應(yīng)。

[1]BECHAZ C,THOMAS H. GIB portable tracking systems:the underwater use of GPS[J]. Hydro International,2000(8):1-9.

[2]顧曉東. 基于矢量水聽(tīng)器的水下目標(biāo)被動(dòng)跟蹤研究[D].武漢:海軍工程大學(xué),2009.

[3]龔建偉,熊光明.Visual C ++ /Turbo C 串口通信編程實(shí)踐[M].北京:電子工業(yè)出版社,2008.

[4]候俊杰.深入淺出MFC[M].2 版.武漢:華中科技大學(xué)出版社,2010.

[5]LIU S,LIU J.The Serial Communication Program using Windows API[J].Computer Applications,2002,20(2):43-44.

[6]晏春海,田蔚風(fēng),王俊璞,等.多線(xiàn)程技術(shù)在分時(shí)串口通信中的應(yīng)用[J].儀表技術(shù)與傳感器,2004(5):15-17.

猜你喜歡
浮標(biāo)緩沖區(qū)指針
嵌入式系統(tǒng)環(huán)形緩沖區(qū)快速讀寫(xiě)方法的設(shè)計(jì)與實(shí)現(xiàn)
受了委屈的浮標(biāo)君
受了委屈的浮標(biāo)君
受了委屈的浮標(biāo)君
家教世界(2023年7期)2023-03-22 12:11:24
受了委屈的浮標(biāo)君
家教世界(2023年4期)2023-03-04 07:31:28
偷指針的人
為什么表的指針都按照順時(shí)針?lè)较蜣D(zhuǎn)動(dòng)
關(guān)鍵鏈技術(shù)緩沖區(qū)的確定方法研究
基于改進(jìn)Hough變換和BP網(wǎng)絡(luò)的指針儀表識(shí)別
ARM Cortex—MO/MO+單片機(jī)的指針變量替換方法
长沙市| 高尔夫| 澳门| 建阳市| 寿光市| 塔城市| 临西县| 乌兰县| 习水县| 夏津县| 蚌埠市| 桓仁| 罗定市| 枣强县| 新津县| 吉林省| 安多县| 平定县| 新化县| 清河县| 松江区| 溧阳市| 桑植县| 大埔区| 德惠市| 平邑县| 方城县| 仪征市| 淮北市| 大名县| 临潭县| 灵川县| 泾川县| 青河县| 太康县| 桦川县| 镇江市| 紫阳县| 吕梁市| 曲沃县| 出国|