Windows CE 环境下GPS 定位信息的读取和接收
李 艳
(西安建筑科技大学信息与控制工程学院,陕西西安 710055)
摘 要:实现对GPS 定位数据快速准确的接收是车辆导航系统设计的关键技术之一,结合应用实践,通过对GPS 数据格式的解析和对WindowsCE 环境下串行通信方式的研究,提出了利用多线程技术,采用文件异步读写方式接收GPS 定位数据的实现方法.
关键词:车辆导航系统(VNS) ;全球定位系统( GPS) ;Windows CE;串行通信;多线程
中图分类号:P228. 4 文献标识码:A
大多数车辆导航系统是将导航计算机(如PDA) 与GPS OEM 板集成设计,采用Windows CE 嵌入式操作系统,并装载电子地图,通过实时接收GPS 定位数据,实现目标定位、路线规划、语音导航等功能,为车辆快速到达目的地提供帮助如何在Windows CE 环境下实时准确地接收GPS 定位数据是车辆导航系统设计的关键技术之一.
1 GPS 的数据格式
每个GPS 接收机输出都有其独特的通信协议,但同时也都能输出NMEA 格式的数据,为了保证软件系统对于不同GPS 接收机的通用性,本文采用作为导航系统通信标准的NMEA - 0183 协议.
表1 GPS 数据格式解析
$GPRMC ,192456 ,A ,4306. 601 ,N ,01225. 974 ,E ,10. 8 ,0. 0 ,030702 ,1. 7 ,E ,S3 22 < CR > < L F >
$ 语名头
GPRMC GPS 输出RMC 语句
192456 UTC- tiME 24 小时制的标准时间,按照小时/ 分钟/ 秒的格式: 19 :24 :56
A 当前定位状态:A = 有效,V = 无效
4306. 601 LAT 纬度值,精确到小数点前4 位,后3 位:43°06. 601′
N N 表示北纬,S 表示南纬
01225. 974 LON 经度值,精确到小数点前5 位,后3 位:12°25. 974′
E W表示西经,E 表示东经
10. 8 对地速度:单位为节,1 节(knot) = 1852m/ h
0. 0 方位角:真北方向为0°,顺时针方向计算,最大359. 9°,四位输出
030706 日期:2006 年10 月3 日
1. 7 磁偏角(度)
E 磁偏角(东向)
S 3 22 校验位
NMEA - 0183 是美国国家海洋电子协会为海用电子设备制定的标准格式. 目前广泛采用的是Ver
2. 00 版本.
在NMEA - 0183 协议中规定: GPS 信息通过ASCII 语句输出,每条语句以一个‘ $’开始,以一个
“< CR > < L F > ”序列结束,并且每条语句不能超过80 个字符.
表1 所示为一条典型的NMEA - 0183 (version 2. 00) 输出语句.RMC 语句是GPS 推荐的最小数据量语句,从中可以获得位置(经、纬度) 、速度、方向、日期、时间等信息,除此之外,还需读取GGA、GSV 等语句,以获得高程、卫星星历等信息.
2 Windows CE 环境下的串行通信
图1 导航计算机与GPS 的连接图
2. 1 导航计算机与GPS OEM板的连接
如图1 所示,不需要通过调制解调器,导航计算机与GPS OEM 板间可以通过RS - 232 串行通信口直接连接。导航计算机串口的收信端与GPS 串口的发信端连接,导航计算机串口的发信端与GPS 串口的收信端连接,两者的信号地短接。因此,导航计算机是通过串行通信方式实现对GPS 定位数据的接收.
2. 2 串行通信的基本原理
串行端口是CPU 和串行设备间的编码转换器,当数据从CPU 经过串行端口发送出去时,字节数据转换为串行的位. 在接收数据时,串行的位被转换为字节数据. 应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口) ,通信完成后必须释放资源(关闭串口) .
2. 3 实现串行通信的编程技术
EMbedded Visual C + + 是快速建立Windows CE 嵌入式系统的工具. 在现代的各种实时监控系统和通信系统中,在Windows CE 下利用VC + + 对串口编程是常用的手段.EMbedded Visual C + + 提供了Windows CE 环境下的MFC(Microsoft 基本类库) ,在MFC 下可采
用两种方式实现串行通信的程序设计:Active X 控件、文件读写.串行通信控件MSCEComm. OCX提供了使用Windows CE 环境下进行串行数据通信的所有协议,VC 为该控件提供了标准的事件处理函数、过程,并通过属性和方法提供了串行通信的设置. 它使用户能够方便地访问串行通信驱动程序的大多数特性,包括输入、输出缓冲区的大小及决定何时使用流控制命令挂起数据传输等. 使用MSCEComm. OCX控件,程序实现非常简单,结构清晰,缺点是欠灵活.
另一种方式利用MFC 的CFile 类对串口进行访问. Windows 中提出文件读写的异步方式,主要是针对文件I/ O 相对较慢的速度而进行的改进,它利用了Windows 的多线程结构. 虽然在Windows 中没有实现任何对文件I/ O 的异步操作,但它却能对串口进行异步操作. 采用异步方式,可以提高系统的整体性能,车辆导航系统对系统可靠性和实时性要求较高,因此应采用这种方式.
2. 4 Windows CE对串行通信的支持
在Windows CE 环境下,串口是系统资源的一部分. 在基于Windows CE 的设备上对串行通信端口读写的任务是由调用文件读写函数完成. Windows CE 串行通信函数如表2 所示.
3 利用多线程技术实现对GPS 定位数据的读取
3. 1 多线程的基本概念
Windows CE 是抢先式的多任务操作系统,多任务指的是系统可以同时运行多个进程,每个进程又可以同时执行多个线程. 进程是应用程序的运行实例,拥有自己的地址空间. 每个进程拥有一个主线程,同时还可以建立其他的线程。线程是操作系统分配CPU 时间的基本实体,每个线程占用的CPU 时间由系统分配,系统不停的在线程之间切换. 进程中的线程共享进程的虚拟地址空间,可以访问进程的资源,处于并行执行状态,这就是多线程的基本概念.
表2 Windows CE 串行通信的函数
函 数描 述
CreateFile 打开串行口
GetCommState 用指定通信设备的当前控制设置填充设备控制块(DCB 结构)
SetCommState
按照DCB 结构的说明配置通信设备. 这个函数重新初始化所有硬件和控制设备,但不清空I/ O 队列
GetCommTimeouts 获得指定通信设备上所有读/ 写操作的超时参数
SetCommTimeouts 设置指定通信设备上所有读/ 写操作的超时参数
WriteFile 向串行口写数据,这样将把数据传送给串行连接另一端的设备
ReadFile 从串行口读数据,这样将从串行连接另一端的设备接收数据
SetCommMask 指定为通信设备监控的一组事件
GetCommMask 获得指定通信设备的事件掩码值
WaitCommEvent
等待指定通信设备的事件的发生. WaitCommEvent 函数监视的事件包含在与设备句柄相关联的事件掩码中
EscapeCommFunction 指导指定通信设备执行扩展功能
ClearCommBreak 恢复指定通信设备的字符传输,并设置传输线路为不可中断状态
ClearCommError 获得通信错误数据,并报告指定通信设备的当前状态
3. 2 程序实现
在Embedded Visual C + + 下,MFC 应用程序的线程由CWinThread 对象表示. Embedded Visual C+ + 把线程分为两种:用户界面线程和工作者线程. 用户界面线程能够提供界面和用户交互,通常用于处理用户输入并响应各种事件和消息;而工作者线程主要用来处理程序的后台任务.
CWinThread 类提供了线程应用的几种主要方法:
Creat Thread 建立线程
SuspendThread 挂起线程
ResumeThread 重新启动线程
Run 过载线程处理循环
Set ThreadPriority 设置线程优先级
Get ThreadPriority 取得线程优先级
Exit Instance 注销线程
多线程的实现可以使得各端口独立,准确地实现串行通信。但在车辆导航系统中,系统时时监测串口,接收串口数据,因此如何协调多个线程、线程之间以何种方式实现同步,这是多线程串行通信程序实现的难点. 以下是以多线程的文件异步读取方式实现对串口数据读取的过程:
(1) 通过CreateFile 函数打开串口
(2) 通过SetCommState 函数设置串口(设置波特率、奇偶校验位、数据位和停止位等参数)
(3) 设置串口超时值
(4) 建立串口读取辅助线程并启动
CreateThread(CREATE- SUSPENDED ,0 ,NULL) ;/ / 建立串口读取线程
ResumeThread() ;/ / 启动线程
(5) 重载线程消息处理循环Run ()
while (1) {/ / 只要线程运行,就处于监视端口行为的无限循环
{
WaitCommEvent (hPort , &dwEvtMask ,0) ;
/ / 等待串口通信事件的发生
switch (dwEvtMask) {
/ / 检测返回的dwEvtMask ,判断发生了什么串口事件case EV-RXCHAR :/ / 接收到字符
ReadFile (hPort , &ch ,1 , &nRead ,0) ; / / 接收串口数据
??????????/ / 处理和解析定位数据
}
}
(6) 通信结束后,关闭串口,注销线程.
需要注意的是导航计算机与GPS 通信时, GPS 通过串口每秒钟发送10 条数据. 在实际导航应用中,不需要读取NMEA - 0183 通讯协议的全部信息,仅需要从中挑选出需要的那部分定位数据(如RMC、GGA、GSV 语句) ,其余的信息应被忽略掉,以减少冗余,提高响应速度.
4 应用实践
通过上述方法编制的串行通信程序在Embedded Visual C + + 4. 0 下编译通过. 加载至联想PDA天玑5000S ,操作系统为Windows CE. net ,外接通信设备为GARMIN GPS 25 OEM. 程序的主要功能是实时读取GPS 的定位数据,实验证明,运行效果良好.
[参 考 文 献]
[1 ] [美]赵亦林. 车辆定位与导航系统[M] . 谭国真译. 北京:电子工业出版社,1999.
[2 ] [美]DOU GLAS L ING. Microsoft Windows CE程序设计[M] . 北京博彦科技发展有限公司译. 北京:北京大学出版
社,1999.
[3 ] [美]MICHAEL J YOUNG. Visual C + + 4 从入门到精通[M] . 邱仲潘译. 北京:电子工业出版社,1997.
[责任编辑 忆 雪]Receiving GPS Positioning Data in Windows CE
L I Yan
(College of Information and Control Engineering , Xi’an University of Architecture and Technology , Xi’an 710055 , China)
Abstract :To realize a quick and accurate receival of GPS positioning data is one of the key technologies in
the design of vehicle navigation system. In combination with practical application and the analysis of the da2
ta pattern of GPS and study on the way of series communication in Windows CE , a practical method was
proposed for receiving GPS positioning data by applying the technology of multiple thread and by the way of
asynchronous reading and writing files.
Key words :vehicle navigation system (VNS) ; global positioning system ( GPS) ; Windows CE ; series com2
munication ; multiple threads
[此贴子已经被作者于2008-7-7 9:29:23编辑过]
0