0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于多線程編程技術(shù)在GPS接收機(jī)中的應(yīng)用研究

電子設(shè)計(jì) ? 來(lái)源:現(xiàn)代電子技術(shù) ? 作者:馮正,韓焱,王黎明 ? 2021-06-08 14:26 ? 次閱讀

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

1 多線程概述

1.1 基本概念

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

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

1.2 VC

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

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

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

1.4 線程同步

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

2 串口通信編程

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

(1)MSComm控件

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

(2)Windows API

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

(3)第三方串口通信類(lèi)

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

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

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

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

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

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

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

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

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

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

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

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

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

編程步驟如下:

(1)建立程序

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

(2)添加類(lèi)文件

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

在視類(lèi)頭文件中定義串口類(lèi)的對(duì)象:CSerialPortm_Port。

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

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

在主線程初始化串口后創(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)收到主線程的寫(xiě)串口命令時(shí),將緩存中的數(shù)據(jù)寫(xiě)到串口。

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

4 結(jié) 語(yǔ)

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

責(zé)任編輯:gt

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • gps
    gps
    +關(guān)注

    關(guān)注

    22

    文章

    2847

    瀏覽量

    165497
  • 接收機(jī)
    +關(guān)注

    關(guān)注

    8

    文章

    1158

    瀏覽量

    53164
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    501

    瀏覽量

    19580
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C++面向?qū)ο?b class='flag-5'>多線程編程 (pdf電子版)

    C++面向?qū)ο?b class='flag-5'>多線程編程共分13章,全面講解構(gòu)建多線程架構(gòu)與增量多線程編程技術(shù)。第1章介紹了
    發(fā)表于 09-25 09:39 ?0次下載

    QNX環(huán)境下多線程編程

    介紹了QNX 實(shí)時(shí)操作系統(tǒng)和多線程編程技術(shù),包括線程間同步的方法、多線程程序的分析步驟、線程基本程序結(jié)構(gòu)以及實(shí)用編譯方法。QNX 是由加拿大
    發(fā)表于 08-12 17:37 ?30次下載

    數(shù)控測(cè)井軟件多線程編程技術(shù)

    為滿足實(shí)時(shí)測(cè)井需求,提高系統(tǒng)資源的利用率和系統(tǒng)性能,在數(shù)控測(cè)井軟件開(kāi)發(fā)中將多線程編程技術(shù)應(yīng)用其中,并對(duì)多線程編程技術(shù)應(yīng)用的可行性和必要性進(jìn)行了分析。給出了軟件的模塊框圖及
    發(fā)表于 01-14 17:17 ?32次下載

    GPS接收機(jī)晶振誤差的模擬方法

    GPS(Global Positioning System)接收機(jī)參考頗率源的性能對(duì)接收機(jī)整體性能有著諸多影響.該文對(duì)
    發(fā)表于 05-13 10:19 ?52次下載

    GPS接收機(jī)基本工作原理

    GPS接收機(jī)基本工作原理GPS接收機(jī)主要由 1、GPS接收機(jī)天線單元;2、
    發(fā)表于 09-03 18:18 ?2.2w次閱讀
    <b class='flag-5'>GPS</b><b class='flag-5'>接收機(jī)</b>基本工作原理

    多線程串口通信技術(shù)GPS的應(yīng)用

    GPS導(dǎo)航系統(tǒng)需要實(shí)時(shí)獲取來(lái)自接收機(jī)串口的定位數(shù)據(jù),在對(duì)串口實(shí)時(shí)監(jiān)控的同時(shí)還可以在前臺(tái)進(jìn)行一些其他的操作,利用基于多線程的串口通信編程思想方法可以很好地解決這一問(wèn)題。
    發(fā)表于 09-26 12:15 ?1451次閱讀
    <b class='flag-5'>多線程</b>串口通信<b class='flag-5'>技術(shù)</b><b class='flag-5'>在</b><b class='flag-5'>GPS</b><b class='flag-5'>中</b>的應(yīng)用

    LabWindows_CVI多線程技術(shù)應(yīng)用研究

    分析了線程與進(jìn)程的關(guān)系,研究了LabWindows/CVI多線程技術(shù)運(yùn)行機(jī)制及其數(shù)據(jù)保護(hù)機(jī)制,對(duì)利用異步定時(shí)器實(shí)現(xiàn)的多線程軟件與傳統(tǒng)單
    發(fā)表于 08-29 14:53 ?68次下載
    LabWindows_CVI<b class='flag-5'>多線程</b><b class='flag-5'>技術(shù)</b>的<b class='flag-5'>應(yīng)用研究</b>

    多線程實(shí)現(xiàn)GPS接收機(jī)與PDAWindows CE下的串口通

    本文簡(jiǎn)單介紹了 GPS 接收機(jī)串口通信的基本概念和 GPS 數(shù)據(jù)輸出的格式。主要論述了 如何用 多線程編程方法
    發(fā)表于 04-18 14:12 ?5次下載

    GPS接收機(jī)抗高過(guò)載技術(shù)研究

    GPS接收機(jī)抗高過(guò)載技術(shù)研究,需要的下來(lái)看看,
    發(fā)表于 12-17 16:33 ?7次下載

    linux多線程編程技術(shù)

    1 引言 線程(thread)技術(shù)早在60年代就被提出,但真正應(yīng)用多線程到操作系統(tǒng)中去,是80年代中期,solaris是這方面的佼佼者。傳統(tǒng)的 Unix也支持
    發(fā)表于 10-24 16:01 ?5次下載

    WinCE多線程編程技術(shù)無(wú)紙記錄儀的應(yīng)用

    WinCE多線程編程技術(shù)無(wú)紙記錄儀的應(yīng)用
    發(fā)表于 10-25 09:50 ?2次下載
    WinCE<b class='flag-5'>多線程</b><b class='flag-5'>編程技術(shù)</b><b class='flag-5'>在</b>無(wú)紙記錄儀<b class='flag-5'>中</b>的應(yīng)用

    基于AT91SAM9261GPS接收機(jī)的應(yīng)用

    基于AT91SAM9261GPS接收機(jī)的應(yīng)用
    發(fā)表于 10-25 10:13 ?4次下載
    基于AT91SAM9261<b class='flag-5'>在</b><b class='flag-5'>GPS</b><b class='flag-5'>接收機(jī)</b><b class='flag-5'>中</b>的應(yīng)用

    什么是多線程編程?多線程編程基礎(chǔ)知識(shí)

    摘要:多線程編程是現(xiàn)代軟件技術(shù)很重要的一個(gè)環(huán)節(jié)。要弄懂多線程,這就要牽涉到多進(jìn)程。本文主要以多線程
    發(fā)表于 12-08 16:30 ?1.2w次閱讀

    針對(duì)GPS接收機(jī)載波跟蹤環(huán)路的設(shè)計(jì)與研究

    隨著GPS 衛(wèi)星應(yīng)用產(chǎn)業(yè)化進(jìn)程的逐步發(fā)展,對(duì)導(dǎo)航接收機(jī)關(guān)鍵技術(shù)的攻關(guān)必將縮短衛(wèi)星導(dǎo)航終端產(chǎn)品的研發(fā)周期,推進(jìn)衛(wèi)星導(dǎo)航應(yīng)用產(chǎn)業(yè)化的進(jìn)程。GPS 接收
    發(fā)表于 12-10 04:37 ?1991次閱讀
    針對(duì)<b class='flag-5'>GPS</b><b class='flag-5'>接收機(jī)</b><b class='flag-5'>中</b>載波跟蹤環(huán)路的設(shè)計(jì)與<b class='flag-5'>研究</b>

    關(guān)于Linux下多線程編程技術(shù)學(xué)習(xí)總結(jié)

    Linux下多線程編程技術(shù) 作為一個(gè)IT人員,不斷的學(xué)習(xí)和總結(jié)是我們這個(gè)職業(yè)習(xí)慣,所以我會(huì)將每個(gè)階段的學(xué)習(xí)都會(huì)通過(guò)一點(diǎn)的總結(jié)來(lái)記錄和檢測(cè)自己的學(xué)習(xí)效果,今天為大家總結(jié)了關(guān)于Linux下多線程
    發(fā)表于 04-22 03:12 ?2139次閱讀
    關(guān)于Linux下<b class='flag-5'>多線程</b><b class='flag-5'>編程技術(shù)</b>學(xué)習(xí)總結(jié)