当前位置:首页 > 通信技术 > 通信设计应用
[导读] 引 言   GPS(Global PosiTIon System)具有全球性、全天候性优势的定位、定时、测速系统,用户利用GPS接收机接收卫星发射的信号,从而获取当前位置的大地坐标、高程

引 言

  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,其他步骤保持缺省状态。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭