微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 多线程串口通信技术在GPS中的应用

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

时间:08-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导航系统分析,将程序分成以下几个线程:

  主线程:负责处理用户界面的消息处理,按照预定义流程调度其他线程处理数据。

  串口监视线程:监视串口,采集数据并将数据保存到一个缓冲区。

  入库线程:从缓冲区读取数据进行相应处理并将处理好的数据存入数据库。

显示线程:通过地图匹配算法将用户实时位

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top