999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

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

2012-07-09 02:31:28胡科強王小寧
兵器裝備工程學報 2012年8期

胡科強,王小寧

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

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

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

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

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

2 各模塊設計

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

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

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

B≥數(shù)據(jù)幀同步頭+數(shù)據(jù)總長度+浮標ID 號+浮標位置數(shù)據(jù)+浮標狀態(tài)數(shù)據(jù)+(目標ID 號+目標方位數(shù)據(jù)+測試狀態(tài)數(shù)據(jù))×目標個數(shù)。

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

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

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

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

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

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

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

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

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

2.2 基于API 的多線程串口通信

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

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

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

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

while (pDoc- >m_hConnected){

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

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

for(;;){//無限循環(huá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ū)無數(shù)據(jù)

continue ;}

//無限等待,阻礙該線程,直到等待的事件到來。

//等待的事件有:

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;{//關閉串口事件

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 工作者線程流程

2.3 串口通信類設計

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

class CComm{

private

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

HANDLE m_hShutdownEvent; //關閉事件句柄,用于在關閉程序時關閉線程。

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

CWnd * pWnd;//該串口對應的窗體指針

public

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

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

void WriteToPort(unsigned char * ch,int num);//串口寫函數(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)形隊列類CCirQue:

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

Class CCirQue{

public

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

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

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

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

CCirQue();

Virtual ~CCirQue();

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

};

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

3 結(jié)束語

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

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

[2]顧曉東. 基于矢量水聽器的水下目標被動跟蹤研究[D].武漢:海軍工程大學,2009.

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

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

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

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

主站蜘蛛池模板: 日韩av手机在线| 中国一级特黄大片在线观看| 久久综合丝袜日本网| 日日拍夜夜操| 亚洲精品午夜无码电影网| 欧洲在线免费视频| 成人福利免费在线观看| 欧美成人看片一区二区三区 | 麻豆国产在线观看一区二区| 精品国产三级在线观看| 高清精品美女在线播放| 亚洲性影院| 精品人妻一区二区三区蜜桃AⅤ| 国产在线观看第二页| 亚洲一区二区三区香蕉| 亚洲无线视频| 国产精品无码AV片在线观看播放| аⅴ资源中文在线天堂| 国产情精品嫩草影院88av| 五月婷婷亚洲综合| 亚洲va在线∨a天堂va欧美va| 18禁色诱爆乳网站| 91青青草视频| 国产美女91视频| 国产乱子伦视频在线播放| 久久人妻系列无码一区| 在线观看国产黄色| 亚洲欧美日本国产综合在线 | 国产精品jizz在线观看软件| 国产成人久久综合777777麻豆| 国产va欧美va在线观看| 久久99国产精品成人欧美| 久久综合九色综合97婷婷| 国产网站一区二区三区| 色哟哟色院91精品网站| 三上悠亚一区二区| 欧美啪啪一区| 欧美一级99在线观看国产| 色网站在线免费观看| 亚洲精品国产日韩无码AV永久免费网 | 日韩国产一区二区三区无码| 3344在线观看无码| 亚洲欧美不卡中文字幕| 喷潮白浆直流在线播放| 久久一日本道色综合久久| 国产人人乐人人爱| 深爱婷婷激情网| 97精品国产高清久久久久蜜芽 | 91探花国产综合在线精品| 午夜福利网址| 亚洲国产亚综合在线区| 91亚洲精选| 久久中文无码精品| 日本欧美在线观看| 人妻精品久久无码区| 久久国产精品嫖妓| 亚洲欧美成aⅴ人在线观看| 亚洲AV无码不卡无码| 久操线在视频在线观看| 中文国产成人精品久久| 在线播放真实国产乱子伦| 亚洲精品va| 成人综合网址| 日本成人不卡视频| 欧洲极品无码一区二区三区| 欧美中文字幕在线视频| 亚洲精品中文字幕无乱码| 人人澡人人爽欧美一区| 在线播放精品一区二区啪视频| 国产精品19p| 久久夜色精品| 欧美中文字幕一区二区三区| 欧美色亚洲| 在线观看无码a∨| 久无码久无码av无码| 国产在线观看第二页| 国产va免费精品观看| 青青热久免费精品视频6| 99热这里只有精品免费国产| 日韩黄色大片免费看| 国产精品嫩草影院视频| 永久在线播放|