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(串口接收缓冲区内有一个字符)的响应函数声明,即: