VB语言下GPS导航数据的提取并在MapX控件中显示的实现
摘 要:本文针对导航系统设计和开发过程中涉及到的GPS导航数据和MapX控件进行了介绍,并提出了利用VB语言进行定位信息的提取和在MapX控件中显示的方法。
关键词 :NMEA-0183;MapX;串口通讯;导航系统
1前言
随着社会经济的不断进步,科学水平的飞速发展,人们对类似车载GPS定位系统的位置服务也越来越关注。GPS定位系统接收GPS卫星信号,并将解算的位置通过接口显示在电子地图上,就可以实现位置显示的基本定位功能。在本文中,我们将探讨如何在VB语言条件下,通过MapX控件来提取和显示GPS定位信息,从而为进一步的GPS定位服务提供一个基础平台。
2 GPS导航数据格式与MapX控件介绍
2.1GPS导航数据格式
GPS导航数据主要是NMEA协议的数据,目前主要较新版本为 NMEA-0183,它是美国国家海洋电子协会为统一海洋导航规范而制定的统一标准,该格式标准已经成为国际通用的一种格式[1]。NMEA-0183格式数据串的所有数据都采用SASCII文本字符表示,数据传输以“$”开头,后面是语句头。语句头由五个字母组成,分两部分,前两个字母表示“系统ID”,即表示该语句是属于何种系统或设备,后三个字母表示“语句ID”,表示该语句是关于何方面的数据。语句头后是数据体,包含不同的数据体字段,语句末尾为校验码 (可选),以回车换行符
2.2 MapX控件
MapX控件是MapInfo公司提供的具有强大地图分析功能的Activex控件产品,由于它是一种基于Windows操作系统的标准控件,因而能支持绝大多数标准的可视化开发环境,如 Visual Basic等。利用MapX控件能够简单快速地在软件中嵌入地图化功能,增强软件的空间分析能力,实现大部分地图编辑和空间分析的功能。
MapX为开发人员提供了一个快速、易用、功能强大的地图化组件。在VB等可视化开发环境中,只需要在设计阶段将MapX控件放入窗体中,并对其进行编程、设置属性、调用方法或相应事件,即可实现数据可视化、专题分析、地理查询、地理编码等各种丰富的地图信息系统功能。对MapX编程,不需要有任何MapBasic的知识,而且大多数任务可以通过简单的设置MapX控件的属性来完成。
3 GPS导航数据的提取
3.1 RS-232通信
RS-232串行通讯分为同步和异步两种模式,目前使用的仪器绝大部分都使用异步传输。RS-232也有相关的电气标准定义,在ITU(国际电信联盟)咨询机构CCITT(国际电话与电报顾问委员会)公布了RS-232标准之后,由EIA(电子工业联合会)制订。RS-232串口通讯的方法主要有以下几种方法[2]:
(1)通过调用API函数实现串口通讯;
(2)利用Windows读写端口函数;
(3)利用第三方提供或自己编写的通信类;
(4)通过Windows串口通信组件,实现串口调用。
其中方法(4)较简单稳定,只需对串口进行简单配置,并且不需要了解其控件的内部源码,可以快速稳定的实现通讯及数据的提取。因此,本文采用最后一种方法。
在进行通讯之前,首先需要设置串口通讯的接口参数,包括设置通信连接端口号,该端口号在MSComm控件的Commport属性中设置(计算机一般只包括com1和com2两个端口,可通过计算机的设备管理器查看);初始化信息,该信息主要是通信的波特率、奇偶校验检查方式、数据位数和停止位,可在控件的Settings属性中设置(格式是“BBBB,P,D,S”,分别是波特率,奇偶校验,数据位数,停止位数);引发接收事件的字节数,亦即控件的RThreshold属性,该属性设置和返回引发接收事件的字节数;串行端口读入的字符串长度或者字节数,可在控件的InputLen属性中设置,Visual Basic 程序可使用控件的Input命令将存放在输入缓冲区的字符读入,但如果要指定所读入的字符长度则需设置本属性。
3.2数据接收
通过上述属性的设置,便可进行串口的通讯和数据的接收。MSComm控件的PortOpen属性用于设置通行端口的连接状态,将其设为TRUE以打开串行端口,接收数据流,运行完毕后将其关闭(在Visual Basic的设计中,端口会在程序结束时自动关闭)程序代码如下:
If MSComm1.PortOpen = FALSE Then
MSComm1.PortOpen = TURE
End If
则数据开始流入到接收缓冲区中,并引发OnComm()事件。不同的情况,引发的事件也不相同,当事件参数为ComEvReceive时,表明接收到Rthreshold字符,然后通过Input方法将缓冲区内的数据读出。在读出过程中,系统会自动将缓冲区内的数据删除。
Private Sub MSComm1_OnComm()
Dim S As String
Select Case MSComm1.CommEvent
Case ComEvReceive ’接收到 Rthreshold字符
S = MSComm1.Input ’从缓冲区内读出InputLen设定字符数的数据
GetGPSChar S ’获取完整的数据语句函数
End Select
End Sub
GetGPSChar(Data As String)函数用来获取完整的语句,通过检查接收数据的回车换行符来判断数据是否为同一语句的数据,由于数据是连续的。因此,回车换行可以作为本完整语句的起始和下一完整语句的开始标志。
虽然串行传输时有奇偶校验,但是奇偶校验只是针对一个字节而言,对于大数据量的传输时,有时为了保证语句的完整性和正确性,则必须通过最后的检验码进行校验,校验的算法是以数据头“$”和“*”之间的所有字节求异或值,将该值与*后处的值进行比较,如果相同,则说明语句完整,否则抛弃该语句,重新读取新的语句,直到获得新的完整语句为止。
至此,已获得完整的语句,然后通过程序将语句中各个字段的信息从中提取出来。在该步骤之中,可以利用VB的Split()函数。该函数返回一个下标从零开始的一维数组,它可以根据用户自己定义的间隔符号提取语句中的数据,并自动生成一个字符串数组。
4 在MapX中显示位置
利用点图元来表示位置信息,点图元在电子地图中的位置就是从GPS 数据中提取到的经纬度数据信息,然后按照一定频率来刷新所在的图层, 就实现车辆等的实时定位信息了[3]。但是在刷新图元的同时将刷新该图层上的所有图元, 速度比较慢。为此,可以将GPS 的点图元置于一个单独的图层中。并利用MapX的动态图层AnimationLayer来快速刷新显示GPS定位信息,将这个图层赋予动态图层的属性,该图层就成为动态图层,并且自动位于所有图层的最上方,设GPS点图元位于名称为GPSLayer的图层上,该图层转化为动态图层的代码如下:
Set Map1.Layers.AnimationLayer = Map1.Layers("GPSlayer") '将轨迹图层设为动态图层(加快刷新速度)
具体的实现步骤如下;
在VB中创建项目后,在窗体中添加MapX控件,名称设置为Map1,按照GPS位置,添加代表车辆的符号,代码如下:
Dim mobileftr As New MapXLib.Feature
Dim mobileobj As MapXLib.Feature
mobileftr.Attach Map1
mobileftr.Type = miFeatureTypeSymbol '定义点图元类型
mobileftr.Style = Map1.DefaultStyle '暂时定为为默认样式
mobileftr.Point.Set GPSlongS, GPSlatS '重新为GPS点位置
mobileftr.Update
Set mobileobj = Map1.Layers("GPSlayer").AddFeature(mobileftr) '将点图元增加到动态图层实时的显示车辆在地图中的位置:
mobileftr.Point.Set GPSlongS, GPSlatS '重新为GPS点位置
Map1.Layers("GPSlayer").Refresh '刷新地图的动态图层
如果当位置到达地图窗口的边缘时,可以把位置设置成窗口的中心:
Map1.CenterX = mobileftr.Point.X
Map1.CenterY = mobileftr.Point.Y
至此,便实现了GPS位置信息在MapX中的显示。
5 结语
通过本文的设计方法可以快速稳定的实现GPS导航数据提取和串口通讯及并较好的显示在MapX控件中,并可将其应用于其他高层应用决策系统中,例如各种汽车监控,远洋捕捞和海洋勘探系统等。该系统在Window XP操作系统下,使用VB 6.0语言实现,经试验效果明显,并应用于实际的软件工程之中。
参考文献
[1] 北京合众思壮科技有限责任公司技术部 GARMIN GPS OEM 产品说明书.
[2] 范逸之,陈立元. Visual Basic与RS-232串行通信控制 清华大学出版社.
[3] 徐和平,徐德军,钟美;基于电子地图的GPS车辆导航系统研究[J];地理空间信息;2005年04期.
下一篇:分析CORS RTK技术实际应用优劣