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

多線程串口通信技術在GPS導航中的應用

2009-05-12 03:14:34王黎明
現代電子技術 2009年5期

馮 正 韓 焱 王黎明

摘 要:GPS導航系統需要實時獲取來自接收機串口的定位數據,在對串口實時監控的同時還可以在前臺進行一些其他的操作,利用基于多線程的串口通信編程思想方法可以很好地解決這一問題。介紹多線程的基本概念和串口通信編程技術,分析了GPS導航系統的功能和需求,著重闡述了采用基于多線程的CSerialPort類的串口通信方法來獲取定位數據,并且給出了CSerialPort類的使用方法。經過調試,程序運行平穩。

關鍵詞:多線程;串口通信;CSerialPort;GPS導航

中圖分類號:TP399文獻標識碼:B

文章編號:1004-373X(2009)05-028-03

Application of Multi-thread Serial Port Communication Technology in GPS Navigation System

FENG Zheng1,HAN Yan2,WANG Liming2

(1.National Key Laboratory of Electronic Testing Technology,North University of China,Taiyuan,030051,China;

2.Information Detection and Treatment Institute of Technology,North University of China,Taiyuan,030051,China)

Abstract:The GPS navigation system needs not only gaining real-time orientation data from the receiver serial port but also operating other somethings,the way that based on the multi-thread and the serial communication programming technology theory can solve this question.The multi-thread basic concept and the serial port communication programming technology are introduced,and the GPS navigation system′s function and the requirement are analysed,real-time orientation data by using CSerialPort class based on the multi-thread,and the application method of CSerialPort class are given.After the debugging,the program runs steady.

Keywords:multi-thread;serial port communication;CSerialPort;GPS navigation

0 引 言

GPS(Global Position System)具有全球性、全天候性優勢的定位、定時、測速系統,用戶利用GPS接收機接收衛星發射的信號,從而獲取當前位置的大地坐標、高程和時間等信息,達到定位、導航或測量高程的目的。衛星導航定位技術被廣泛應用于海洋勘測、海洋工程、海洋開發和軍事作戰中,高精度、快捷方便、全天候等優良特性,使其越來越受到人們的青睞[1]。在GPS導航中,需要實時采集遵循NMEA0183協議的GPS數據,對數據進行處理后,通過ODBC接口將用戶的位置、時間、速度等信息存到數據庫,為以后在電子地圖上實時顯示目標位置提供依據。為了避免由于一直等待串口I/O操作而引起的線程阻塞,要求程序在對串行端口進行實時監控的同時,可以在前臺進行數據提取、保存、顯示等操作。為了解決實時性和多任務處理,避免某項任務長時間占用CPU,多線程編程是一個比較理想的選擇。

1 多線程概述

1.1 基本概念

進程是程序在計算機上的一個執行實例,線程是程序中的一條執行分支,多線程就是在同一個程序中可以同時執行多個任務。每一個進程至少有一個主執行線程,它無需由用戶去主動創建,是由系統自動創建的。用戶根據需要在應用程序中創建其他線程,多個線程并發地運行于同一個進程中。

一個進程中的所有線程都在該進程的虛擬地址空間中,共同使用這些虛擬地址空間、全局變量和系統資源[2]。

1.2 VC++環境對多線程技術的支持

Visual C++ 6.0中,MFC類庫提供了對多線程編程的支持,使得多線程編程更加方便。MFC中有兩類線程,分別稱之為工作者線程和用戶界面線程。二者的主要區別在于工作者線程沒有消息循環,而用戶界面線程有自己的消息隊列和消息循環。工作者線程通常用來執行后臺計算和維護任務。用戶界面線程一般用于處理獨立于其他線程執行之外的用戶輸入,響應用戶及系統所產生的事件和消息等。

1.3 線程創建、掛起、恢復、終止

在MFC中,一般用全局函數AfxBeginThread()來創建并初始化一個線程的運行,該函數有兩種重載形式,分別用于創建工作者線程和用戶界面線程。SuspendThread() 和ResumeThread()分別用于掛起指定的線程和恢復用SuspendThread()掛起的線程。ExitThread(DWORD dwExitCode)用于線程終結自身的執行。

1.4 線程同步

線程之間經常要同時訪問一些資源,因此對共享資源進行訪問引起沖突是不可避免的。為了解決這種資源沖突問題,必須引入線程同步的概念。Win32 API提供了多種同步控制對象來解決共享資源訪問沖突,包括使用臨界區、使用互斥對象、使用信號量、使用事件[3]。

2 串口通信編程

目前,在Windows下編程時,常用的串口通信主要有3種方法:用MSComm通信控件;用Windows API進行編程;使用第三方提供的一些串口通訊類進行編寫[4]。

(1) MSComm控件

利用MSComm控件會使編程快捷簡單。然而,由于做了大量的封裝,降低了編程的可控性和靈活性,因此在多線程多串口編程時,需要做許多復雜的處理。

(2) Windows API

利用Windows API編寫串口程序,特別是復雜的多線程串口程序時,對于程序員的編程能力要求較高。除了需要程序員熟練掌握和使用眾多的API函數,能編寫很多底層代碼之外,還必須熟悉線程的編程方法。

(3) 第三方串口通信類

利用第三方的串口通信類進行串口編程時,既可以使編程效率高,程序可控性強,又比Window API編程簡單,其中應用最多的第三方的串口通信類是CSerialPort。它基于多線程,是一個Win32 API的打包類,對處理串口的Win32 API類進行了封裝,借助這個類可以很方便地對串口進行操作,容易實現多線程的串口通信,編寫的程序在Windows 98/NT/2000/XP操作系統下可很好地運行。

比較3種串口通信方式,可以發現使用第三方串口通信類CSerialPort是實現Windows下多線程串口編程的較好選擇。

3 多線程編程技術在GPS數據采集系統中的應用

3.1 GPS導航系統功能分析

GPS導航是通過GPS定位技術實時給出用戶所在的位置,這就要求需要實時接收來自GPS接收機串口的定位數據,在實時監視串口的同時還需要進行數據存儲、顯示等,利用多線程串口通信技術將很好地解決這個問題。通過對GPS導航系統分析,將程序分成以下幾個線程:

主線程:負責處理用戶界面的消息處理,按照預定義流程調度其他線程處理數據。

串口監視線程:監視串口,采集數據并將數據保存到一個緩沖區 。

入庫線程:從緩沖區讀取數據進行相應處理并將處理好的數據存入數據庫。

顯示線程:通過地圖匹配算法將用戶實時位置顯示在電子地圖上。

GPS導航系統框圖如圖1所示。

3.2 具體實現

系統首先對線程在相應的頭文件中說明,然后在程序初始化時加入創建程序代碼,這樣創建后,線程就可以和主線程并發執行了。主線程、入庫線程、顯示線程與一般的編程處理相同,所以下面著重說明串口監視線程。

對串口的操作采用基于多線程編程的CSerialPort類,其工作流程如下:首先設置好串口參數,再開啟串口監測工作線程。串口監測工作線程監測到串口接收到的數據流、控制事件或其他串口事件后,就以消息方式通知主程序,激發消息處理函數進行數據處理,這是對接收數據而言的;發送數據可直接向串口發送[5]。應用程序流程如圖2所示。

編程步驟如下:

(1) 建立程序

建立一個基于單文檔的MFC應用程序CSerialPortTest,其他步驟保持缺省狀態。

(2) 添加類文件

將SerialPort.h和SerialPort.cpp兩個類文件復制到工程文件夾中,用Project-Add to Project-Files命令將上述兩個文件加入工程,并在任何要調用這個類的模塊中加上#include SerialPort.h文件。

在視類頭文件中定義串口類的對象:CSerialPort m_Port。

(3) 人工增加串口消息響應函數OnCommunication(WPARAM ch,LPARAM port)

首先在CSerialPortTestView.h中添加串口字符接收消息WM_COMM_RXCHAR(串口接收緩沖區內有一個字符)的響應函數聲明,即:

afx_msg LONG OnCommunication(WPARAM ch,LPARAM port);

然后在CSerialPortTestView.cpp文件中進行WM_COMM_RXCHAR消息映射:

ON_MESSAGE(WM_COMM_RXCHAR,OnCommunication)

接著在CSerialPortTestView.cpp中加入函數的實現,即:

LONG CSerialPortTestView::OnCommunication(WPARAM ch,LPARAM port)

{ … }

(4) 初始化串口并開啟串口監視線程

在視創建時初始化串口,首先利用ClassWizard生成OnInitialUpdate()函數。代碼如下:

Void CSerialPortTestView::OnInitialUpdate()

{

CView::OnInitialUpdate();

if(m_Port.InitPort(this,1,4 800,′N′,8,1,EV_RXFLAG | EV_RXCHAR,512))

//設置端口為COM1,波特率4 800 b/s,數據位8,停止位1,檢驗位N,緩沖區512

{

m_Port.StartMonitoring();

//啟動串口監視線程,利用WaitCommEvent函數對串口上發生的事件進行獲取并根據事件的不同

類型進行相應的處理,利用WaitForMultipleObjects函數對串口相關的用戶控制事件進行等待并做相應處理

}

else

{

AfxMessageBox(“沒有發現此串口”);

}

}

在StartMonitoring()這個成員函數內部調用AfxBeginThread創建了一個工作線程,它的函數申明如下:

BOOL CSerialPort::StartMonitoring()

{

if(!(m_Thread=AfxBeginThread(CommThread,this)))

return FALSE;

TRACE("Thread started\n");

return TRUE;

}

在主線程初始化串口后創建CommThread函數進入死循環,線程一直監視串口事件,當讀串口事件發生,讀取串口接收到的數據,向主線程發自定義消息WM_COMM_RXCHAR,通知主線程在相應的消息響應函數中進行數據處理,當收到主線程的寫串口命令時,將緩存中的數據寫到串口。

(5) 在OnCommunication()函數中進行數據處理

每當串口接收緩沖區內有一個字符時,就產生一個WM_COMM_RXCHAR消息,觸發OnCommunication函數。這時就可以在函數中進行相應數據處理,提取出時間、經緯度、速度等定位的關鍵數據,然后將這些數據保存到數據庫。

LONG CMainFrame::OnCommunication(WPARAM ch,LPARAM port){

m_strReceived+=(char)ch;

while((m_strReceived.Find(0x0d)!=-1)&&(m_strReceived.Find(0x0a)!=-1)){

int startLF=m_strReceived.Find(0x0a);

//此行表示找到換行的位置并返回值

int endCR=m_strReceived.Find(0x0d);

if(startLF>endCR)

endCR=m_strReceived.Find(0x0d,startLF);

//從startLF位置開始找回車符

…………

}

4 結 語

串行通訊在通訊領域被廣泛應用。利用基于多線程的第三方串口通信類CSerialPort很好地解決了由于串口長時間占用CPU而引起的線程堵塞等問題,編程簡單、方便、可移植性強,對于其他類型的串口通信問題均可采用。該程序由Microsoft Visual C++ 6.0編譯,在Windows XP下運行通過。

參考文獻

[1]吳自銀.一種基于電子地圖的GPS導航定位技術 [J].海洋通報,2001,20(6):65-71.

[2]吳先亮,劉春生.基于多線程的串口通信軟件的設計與實現[J].控制工程,2004,11(2):171-174.

[3]趙素林.利用多線程實現串口數據的實時圖形化顯示 [J].計算機技術與發展,2006,16 (6):124-126.

[4]蔣大奎.串口通信實現實時數據高速采集[J].北華航天工業學院學報,2007,17(4):15-16.

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

[6]黃凌.基于單片機的GPS信息處理系統.現代電子技術,2007,30(21):60-61,75.

作者簡介 馮 正 男,1980年出生,山西忻州人,碩士。主要研究方向為遙控遙測技術。

韓 焱 男,1957年出生,山西汶水人,教授、博士生導師。主要研究領域為信號與信息處理、無線通信。

王黎明 男,1974年出生,山西運城人,教授、碩士研究生導師。主要研究方向為兵器無損檢測技術。

主站蜘蛛池模板: 99久久国产综合精品2020| www.youjizz.com久久| 欧美成人午夜在线全部免费| 久草网视频在线| 香蕉网久久| 亚洲第一视频网| 亚洲国产日韩一区| 无码免费视频| 无码AV动漫| 毛片视频网址| 五月激激激综合网色播免费| 国产香蕉一区二区在线网站| 国产精品v欧美| 亚洲丝袜第一页| 国产精品久久久久鬼色| 国产网站在线看| aⅴ免费在线观看| 青青青视频免费一区二区| 成人福利在线观看| 国产精品林美惠子在线播放| 欧美在线导航| 中国成人在线视频| 中文字幕丝袜一区二区| 亚洲中文字幕无码爆乳| 国产午夜精品鲁丝片| 欧美色图久久| 99国产精品免费观看视频| 欧美啪啪一区| 久久亚洲中文字幕精品一区| 草逼视频国产| 一区二区理伦视频| 国产精品19p| 国产人人射| 亚洲视频一区| 无码中文AⅤ在线观看| 91伊人国产| 无码中文AⅤ在线观看| 亚洲色图在线观看| 91久久夜色精品国产网站| 欧美日韩国产成人高清视频| 97精品久久久大香线焦| 亚洲国产欧洲精品路线久久| 日本a级免费| 亚洲日韩精品无码专区| 国内自拍久第一页| 中文字幕av一区二区三区欲色| 国产96在线 | 中文字幕中文字字幕码一二区| 国产成人亚洲无吗淙合青草| 成人欧美在线观看| 亚洲高清在线天堂精品| 国产精品欧美在线观看| 中文字幕亚洲乱码熟女1区2区| 日本欧美成人免费| 国产日韩欧美黄色片免费观看| 噜噜噜久久| 91丨九色丨首页在线播放| 国产区网址| 激情综合网激情综合| 91麻豆精品国产高清在线| 无码国产伊人| 一区二区三区精品视频在线观看| 一区二区三区国产| 成人午夜网址| 2021最新国产精品网站| 最新国产成人剧情在线播放| 亚洲色中色| 91日本在线观看亚洲精品| 国产欧美视频在线观看| 成年人免费国产视频| 国产精品一区二区在线播放| 亚洲国产精品无码久久一线| 97精品伊人久久大香线蕉| 2020极品精品国产 | 99热这里只有免费国产精品| 怡红院美国分院一区二区| 国产国产人成免费视频77777| 国产人成乱码视频免费观看| 天天综合网色中文字幕| 久久99热这里只有精品免费看| 欧美另类第一页| 国产成人精品男人的天堂下载|