0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于多线程编程技术在GPS接收机中的应用研究

电子设计 来源:现代电子技术 作者:冯正,韩焱,王黎明 2021-06-08 14:26 次阅读

GPS(Global Position System)具有全球性、全天候性优势的定位、定时、测速系统,用户利用GPS接收机接收卫星发射的信号,从而获取当前位置的大地坐标、高程和时间等信息,达到定位、导航或测量高程的目的。卫星导航定位技术被广泛应用于海洋勘测、海洋工程、海洋开发和军事作战中,高精度、快捷方便、全天候等优良特性,使其越来越受到人们的青睐。在GPS导航中,需要实时采集遵循NMEA0183协议的GPS数据,对数据进行处理后,通过ODBC接口将用户的位置、时间、速度等信息存到数据库,为以后在电子地图上实时显示目标位置提供依据。为了避免由于一直等待串口I/0操作而引起的线程阻塞,要求程序在对串行端口进行实时监控的同时,可以在前台进行数据提取、保存、显示等操作。为了解决实时性和多任务处理,避免某项任务长时间占用CPU,多线程编程是一个比较理想的选择。

1 多线程概述

1.1 基本概念

进程是程序在计算机上的一个执行实例,线程是程序中的一条执行分支,多线程就是在同一个程序中可以同时执行多个任务。每一个进程至少有一个主执行线程,它无需由用户去主动创建,是由系统自动创建的。用户根据需要在应用程序中创建其他线程,多个线程并发地运行于同一个进程中。

一个进程中的所有线程都在该进程的虚拟地址空间中,共同使用这些虚拟地址空间、全局变量和系统资源。

1.2 VC

VC++环境对多线程技术的支持visual c++6.0中,MFC类库提供了对多线程编程的支持,使得多线程编程更加方便。MFC中有两类线程,分别称之为工作者线程和用户界面线程。二者的主要区别在于工作者线程没有消息循环,而用户界面线程有自己的消息队列和消息循环。工作者线程通常用来执行后台计算和维护任务。用户界面线程一般用于处理独立于其他线程执行之外的用户输入,响应用户及系统所产生的事件和消息等。

1.3 线程创建、挂起、恢复、终止

在MFC中,一般用全局函数AfxBeginThread()来创建并初始化一个线程的运行,该函数有两种重载形式,分别用于创建工作者线程和用户界面线程。Sus-pendThread()和ResumeThread()分别用于挂起指定的线程和恢复用SuspendThread()挂起的线程。Exit-Thread(DWORD dwExitC0de)用于线程终结自身的执行。

1.4 线程同步

线程之间经常要同时访问一些资源,因此对共享资源进行访问引起冲突是不可避免的。为了解决这种资源冲突问题,必须引入线程同步的概念。Win32 API提供了多种同步控制对象来解决共享资源访问冲突,包括使用临界区、使用互斥对象、使用信号量、使用事件。

2 串口通信编程

目前,在Windows下编程时,常用的串口通信主要有3种方法:用MSC0mm通信控件;用Windows API进行编程;使用第三方提供的一些串口通讯类进行编写。

(1)MSComm控件

利用MSComm控件会使编程快捷简单。然而,由于做了大量的封装,降低了编程的可控性和灵活性,因此在多线程多串口编程时,需要做许多复杂的处理。

(2)Windows API

利用Windows API编写串口程序,特别是复杂的多线程串口程序时,对于程序员的编程能力要求较高。除了需要程序员熟练掌握和使用众多的API函数,能编写很多底层代码之外,还必须熟悉线程的编程方法。

(3)第三方串口通信类

利用第三方的串口通信类进行串口编程时,既可以使编程效率高,程序可控性强,又比Window API编程简单,其中应用最多的第三方的串口通信类是CSerial-Port。它基于多线程,是一个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类,其工作流程如下:首先设置好串口参数,再开启串口监测工作线程。串口监测工作线程监测到串口接收到的数据流、控制事件或其他串口事件后,就以消息方式通知主程序,激发消息处理函数进行数据处理,这是对接收数据而言的;发送数据可直接向串口发送。应用程序流程如图2所示。

编程步骤如下:

(1)建立程序

建立一个基于单文档的MFC应用程序CSerial-PortTest,其他步骤保持缺省状态。

(2)添加类文件

将SerialPort.h和SerialPort.cpp两个类文件复制到工程文件夹中,用Project-Add to Project-Files命令将上述两个文件加入工程,并在任何要调用这个类的模块中加上#include SerialPort.h文件。

在视类头文件中定义串口类的对象:CSerialPortm_Port。

(3)人工增加串口消息响应函数OnCommunica-tion(WPARAM ch,LPARAM port)

首先在CSerialPortTestView.h中添加串口字符接收消息WM_COMM_RXCHAR(串口接收缓冲区内有一个字符)的响应函数声明,即:

在主线程初始化串口后创建CommThread函数进入死循环,线程一直监视串口事件,当读串口事件发生,读取串口接收到的数据,向主线程发自定义消息WM_COMM RXCHAR,通知主线程在相应的消息响应函数中进行数据处理,当收到主线程的写串口命令时,将缓存中的数据写到串口。

(5)在OnCommunication()函数中进行数据处理每当串口接收缓冲区内有一个字符时,就产生一个WM COMM RXCHAR消息,触发OnCommunica—tion函数。这时就可以在函数中进行相应数据处理,提取出时间、经纬度、速度等定位的关键数据,然后将这些数据保存到数据库。

4 结 语

串行通讯在通讯领域被广泛应用。利用基于多线程的第三方串VI通信类CSerialPort很好地解决了由于串口长时间占用CPU而引起的线程堵塞等问题,编程简单、方便、可移植性强,对于其他类型的串口通信问题均可采用。该程序由Microsoft Visual C++6.0编译,在Windows XP下运行通过。

责任编辑:gt

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • gps
    gps
    +关注

    关注

    22

    文章

    2745

    浏览量

    164311
  • 接收机
    +关注

    关注

    8

    文章

    1121

    浏览量

    52627
  • 线程
    +关注

    关注

    0

    文章

    488

    浏览量

    19490
收藏 人收藏

    评论

    相关推荐

    ZigBee技术矿灯监控应用研究

    ZigBee技术矿灯监控应用研究
    发表于 03-15 13:27

    怎么设计低成本GPS接收机

    商用和专用无线应用,全球定位卫星的L1波段信号最微弱。GPS接收机天线收到的信号功率通常都淹没在热噪声基底。为成功地恢复出这些微弱信号
    发表于 08-20 08:09

    请问怎么对GPS接收机进行测试?

    怎么对GPS接收机进行测试?接收机同样的RF环境条件下是如何作出反应的?
    发表于 04-15 07:02

    基于FPGA的GPS接收机设计方案

    利用可编程片上系统(SOPC)技术,设计了一种基于FPGA的GPS接收机。提出了基于多普勒频域移位的捕获策略,并分析了捕获时间。基于延迟锁定环与Costas 环跟踪方法,给出
    发表于 09-19 06:34

    C++面向对象多线程编程 (pdf电子版)

    C++面向对象多线程编程共分13章,全面讲解构建多线程架构与增量多线程编程技术。第1章介绍了
    发表于 09-25 09:39 0次下载

    QNX环境下多线程编程

    介绍了QNX 实时操作系统和多线程编程技术,包括线程间同步的方法、多线程程序的分析步骤、线程基本程序结构以及实用编译方法。QNX 是由加拿大
    发表于 08-12 17:37 30次下载

    数控测井软件中的多线程编程技术

    为满足实时测井需求,提高系统资源的利用率和系统性能,在数控测井软件开发中将多线程编程技术应用其中,并对多线程编程技术应用的可行性和必要性进行了分析。给出了软件的模块框图及
    发表于 01-14 17:17 32次下载

    多线程串口通信技术GPS中的应用

    GPS导航系统需要实时获取来自接收机串口的定位数据,在对串口实时监控的同时还可以在前台进行一些其他的操作,利用基于多线程的串口通信编程思想方法可以很好地解决这一问题。
    发表于 09-26 12:15 1353次阅读
    <b class='flag-5'>多线程</b>串口通信<b class='flag-5'>技术</b>在<b class='flag-5'>GPS</b>中的应用

    LabWindows_CVI多线程技术应用研究

    分析了线程与进程的关系,研究了LabWindows/CVI多线程技术运行机制及其数据保护机制,对利用异步定时器实现的多线程软件与传统单
    发表于 08-29 14:53 68次下载
    LabWindows_CVI<b class='flag-5'>多线程</b><b class='flag-5'>技术</b>的<b class='flag-5'>应用研究</b>

    多线程实现GPS接收机与PDA在Windows CE下的串口通

    本文简单介绍了 GPS 接收机串口通信的基本概念和 GPS 数据输出的格式。主要论述了 如何用 多线程编程方法在 Windows CE 下实
    发表于 04-18 14:12 5次下载

    GPS接收机抗高过载技术研究

    GPS接收机抗高过载技术研究,需要的下来看看,
    发表于 12-17 16:33 7次下载

    linux多线程编程技术

    1 引言 线程(thread)技术早在60年代就被提出,但真正应用多线程到操作系统中去,是在80年代中期,solaris是这方面的佼佼者。传统的 Unix也支持线程的概念,但是在一个进
    发表于 10-24 16:01 5次下载

    WinCE多线程编程技术在无纸记录仪中的应用

    WinCE多线程编程技术在无纸记录仪中的应用
    发表于 10-25 09:50 2次下载
    WinCE<b class='flag-5'>多线程</b><b class='flag-5'>编程技术</b>在无纸记录仪中的应用

    什么是多线程编程?多线程编程基础知识

    摘要:多线程编程是现代软件技术中很重要的一个环节。要弄懂多线程,这就要牵涉到多进程。本文主要以多线程编程
    发表于 12-08 16:30 1.2w次阅读

    关于Linux下多线程编程技术学习总结

    Linux下多线程编程技术 作为一个IT人员,不断的学习和总结是我们这个职业习惯,所以我会将每个阶段的学习都会通过一点的总结来记录和检测自己的学习效果,今天为大家总结了关于Linux下多线程
    发表于 04-22 03:12 2061次阅读
    关于Linux下<b class='flag-5'>多线程</b><b class='flag-5'>编程技术</b>学习总结