亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        多線程串口通信技術(shù)在GPS導(dǎo)航中的應(yīng)用

        2009-05-12 03:14:34王黎明
        現(xiàn)代電子技術(shù) 2009年5期
        關(guān)鍵詞:多線程串口通信

        馮 正 韓 焱 王黎明

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

        關(guān)鍵詞:多線程;串口通信;CSerialPort;GPS導(dǎo)航

        中圖分類號:TP399文獻(xiàn)標(biāo)識碼: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)具有全球性、全天候性優(yōu)勢的定位、定時(shí)、測速系統(tǒng),用戶利用GPS接收機(jī)接收衛(wèi)星發(fā)射的信號,從而獲取當(dāng)前位置的大地坐標(biāo)、高程和時(shí)間等信息,達(dá)到定位、導(dǎo)航或測量高程的目的。衛(wèi)星導(dǎo)航定位技術(shù)被廣泛應(yīng)用于海洋勘測、海洋工程、海洋開發(fā)和軍事作戰(zhàn)中,高精度、快捷方便、全天候等優(yōu)良特性,使其越來越受到人們的青睞[1]。在GPS導(dǎo)航中,需要實(shí)時(shí)采集遵循NMEA0183協(xié)議的GPS數(shù)據(jù),對數(shù)據(jù)進(jìn)行處理后,通過ODBC接口將用戶的位置、時(shí)間、速度等信息存到數(shù)據(jù)庫,為以后在電子地圖上實(shí)時(shí)顯示目標(biāo)位置提供依據(jù)。為了避免由于一直等待串口I/O操作而引起的線程阻塞,要求程序在對串行端口進(jìn)行實(shí)時(shí)監(jiān)控的同時(shí),可以在前臺進(jìn)行數(shù)據(jù)提取、保存、顯示等操作。為了解決實(shí)時(shí)性和多任務(wù)處理,避免某項(xiàng)任務(wù)長時(shí)間占用CPU,多線程編程是一個比較理想的選擇。

        1 多線程概述

        1.1 基本概念

        進(jìn)程是程序在計(jì)算機(jī)上的一個執(zhí)行實(shí)例,線程是程序中的一條執(zhí)行分支,多線程就是在同一個程序中可以同時(shí)執(zhí)行多個任務(wù)。每一個進(jìn)程至少有一個主執(zhí)行線程,它無需由用戶去主動創(chuàng)建,是由系統(tǒng)自動創(chuàng)建的。用戶根據(jù)需要在應(yīng)用程序中創(chuàng)建其他線程,多個線程并發(fā)地運(yùn)行于同一個進(jìn)程中。

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

        1.2 VC++環(huán)境對多線程技術(shù)的支持

        Visual C++ 6.0中,MFC類庫提供了對多線程編程的支持,使得多線程編程更加方便。MFC中有兩類線程,分別稱之為工作者線程和用戶界面線程。二者的主要區(qū)別在于工作者線程沒有消息循環(huán),而用戶界面線程有自己的消息隊(duì)列和消息循環(huán)。工作者線程通常用來執(zhí)行后臺計(jì)算和維護(hù)任務(wù)。用戶界面線程一般用于處理獨(dú)立于其他線程執(zhí)行之外的用戶輸入,響應(yīng)用戶及系統(tǒng)所產(chǎn)生的事件和消息等。

        1.3 線程創(chuàng)建、掛起、恢復(fù)、終止

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

        1.4 線程同步

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

        2 串口通信編程

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

        (1) MSComm控件

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

        (2) Windows API

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

        (3) 第三方串口通信類

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

        比較3種串口通信方式,可以發(fā)現(xiàn)使用第三方串口通信類CSerialPort是實(shí)現(xiàn)Windows下多線程串口編程的較好選擇。

        3 多線程編程技術(shù)在GPS數(shù)據(jù)采集系統(tǒng)中的應(yīng)用

        3.1 GPS導(dǎo)航系統(tǒng)功能分析

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

        主線程:負(fù)責(zé)處理用戶界面的消息處理,按照預(yù)定義流程調(diào)度其他線程處理數(shù)據(jù)。

        串口監(jiān)視線程:監(jiān)視串口,采集數(shù)據(jù)并將數(shù)據(jù)保存到一個緩沖區(qū) 。

        入庫線程:從緩沖區(qū)讀取數(shù)據(jù)進(jìn)行相應(yīng)處理并將處理好的數(shù)據(jù)存入數(shù)據(jù)庫。

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

        GPS導(dǎo)航系統(tǒng)框圖如圖1所示。

        3.2 具體實(shí)現(xiàn)

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

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

        編程步驟如下:

        (1) 建立程序

        建立一個基于單文檔的MFC應(yīng)用程序CSerialPortTest,其他步驟保持缺省狀態(tài)。

        (2) 添加類文件

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

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

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

        首先在CSerialPortTestView.h中添加串口字符接收消息WM_COMM_RXCHAR(串口接收緩沖區(qū)內(nèi)有一個字符)的響應(yīng)函數(shù)聲明,即:

        afx_msg LONG OnCommunication(WPARAM ch,LPARAM port);

        然后在CSerialPortTestView.cpp文件中進(jìn)行WM_COMM_RXCHAR消息映射:

        ON_MESSAGE(WM_COMM_RXCHAR,OnCommunication)

        接著在CSerialPortTestView.cpp中加入函數(shù)的實(shí)現(xiàn),即:

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

        { … }

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

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

        Void CSerialPortTestView::OnInitialUpdate()

        {

        CView::OnInitialUpdate();

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

        //設(shè)置端口為COM1,波特率4 800 b/s,數(shù)據(jù)位8,停止位1,檢驗(yàn)位N,緩沖區(qū)512

        {

        m_Port.StartMonitoring();

        //啟動串口監(jiān)視線程,利用WaitCommEvent函數(shù)對串口上發(fā)生的事件進(jìn)行獲取并根據(jù)事件的不同

        類型進(jìn)行相應(yīng)的處理,利用WaitForMultipleObjects函數(shù)對串口相關(guān)的用戶控制事件進(jìn)行等待并做相應(yīng)處理

        }

        else

        {

        AfxMessageBox(“沒有發(fā)現(xiàn)此串口”);

        }

        }

        在StartMonitoring()這個成員函數(shù)內(nèi)部調(diào)用AfxBeginThread創(chuàng)建了一個工作線程,它的函數(shù)申明如下:

        BOOL CSerialPort::StartMonitoring()

        {

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

        return FALSE;

        TRACE("Thread started\n");

        return TRUE;

        }

        在主線程初始化串口后創(chuàng)建CommThread函數(shù)進(jìn)入死循環(huán),線程一直監(jiān)視串口事件,當(dāng)讀串口事件發(fā)生,讀取串口接收到的數(shù)據(jù),向主線程發(fā)自定義消息WM_COMM_RXCHAR,通知主線程在相應(yīng)的消息響應(yīng)函數(shù)中進(jìn)行數(shù)據(jù)處理,當(dāng)收到主線程的寫串口命令時(shí),將緩存中的數(shù)據(jù)寫到串口。

        (5) 在OnCommunication()函數(shù)中進(jìn)行數(shù)據(jù)處理

        每當(dāng)串口接收緩沖區(qū)內(nèi)有一個字符時(shí),就產(chǎn)生一個WM_COMM_RXCHAR消息,觸發(fā)OnCommunication函數(shù)。這時(shí)就可以在函數(shù)中進(jìn)行相應(yīng)數(shù)據(jù)處理,提取出時(shí)間、經(jīng)緯度、速度等定位的關(guān)鍵數(shù)據(jù),然后將這些數(shù)據(jù)保存到數(shù)據(jù)庫。

        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 結(jié) 語

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

        參考文獻(xiàn)

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

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

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

        [4]蔣大奎.串口通信實(shí)現(xiàn)實(shí)時(shí)數(shù)據(jù)高速采集[J].北華航天工業(yè)學(xué)院學(xué)報(bào),2007,17(4):15-16.

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

        [6]黃凌.基于單片機(jī)的GPS信息處理系統(tǒng).現(xiàn)代電子技術(shù),2007,30(21):60-61,75.

        作者簡介 馮 正 男,1980年出生,山西忻州人,碩士。主要研究方向?yàn)檫b控遙測技術(shù)。

        韓 焱 男,1957年出生,山西汶水人,教授、博士生導(dǎo)師。主要研究領(lǐng)域?yàn)樾盘柵c信息處理、無線通信。

        王黎明 男,1974年出生,山西運(yùn)城人,教授、碩士研究生導(dǎo)師。主要研究方向?yàn)楸鳠o損檢測技術(shù)。

        猜你喜歡
        多線程串口通信
        基于Qt和Flash的嵌入式Linux軟件架構(gòu)設(shè)計(jì)
        Java并發(fā)工具包對并發(fā)編程的優(yōu)化
        串口通信在智能家居監(jiān)控系統(tǒng)中的應(yīng)用
        基于多線程文件傳輸關(guān)鍵技術(shù)研究與實(shí)現(xiàn)
        網(wǎng)頁爬蟲技術(shù)的關(guān)鍵技術(shù)研究探索
        一種基于多線程的高速磁盤鏡像算法
        基于OpenCV的室內(nèi)照明智能控制系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)
        科技視界(2016年13期)2016-06-13 22:01:19
        iOS并發(fā)程序設(shè)計(jì)中幾種方法的特點(diǎn)及使用技巧研究
        電站鍋爐煤粉參數(shù)遠(yuǎn)程監(jiān)控系統(tǒng)的軟件設(shè)計(jì)與實(shí)現(xiàn)
        基于MSP430單片機(jī)的窄帶無線數(shù)據(jù)傳輸模塊的設(shè)計(jì)
        黑丝美腿国产在线观看| 波多野结衣亚洲一区二区三区| 亚洲动漫成人一区二区| 亚洲色图在线视频观看| 亚洲一区二区三区国产| 美女不带套日出白浆免费视频| 国产精品久久久| 女同av在线观看网站| 91羞射短视频在线观看| 国产西西裸体一级黄色大片| 中文字幕乱码人妻在线| 加勒比hezyo黑人专区| 波多野结衣中文字幕久久 | 91亚洲国产成人精品一区.| 男女啪动最猛动态图| 欧美视频二区欧美影视| 国产精品亚洲av国产| 亚洲高清国产一区二区| 亚洲妇女无套内射精| 国产午夜在线观看视频播放| 午夜一区二区在线视频| 末成年人av一区二区| 中文字幕日韩人妻在线视频| 一本一道波多野结衣一区| 国产精品反差婊在线观看| 一区二区三区四区黄色av网站| 日本又色又爽又黄的a片18禁| 日韩精品一区二区三区在线观看| 国产三级精品三级在线观看粤语| 永久免费视频网站在线| 中国农村妇女hdxxxx| 激情人妻在线视频| 精品国产a毛片久久久av| 亚洲精品第一国产综合精品| 亚洲人成网站免费播放| 国产精品成人久久一区二区| 娇小女人被黑人插免费视频| 国产成人无码一区二区三区在线| 欧美激情精品久久999| 美女与黑人巨大进入免费观看| 天天噜日日噜狠狠噜免费|