用VB 实现GPS 信息处理0 引 言目前,GPS 已在许多行业和领域得到广泛应用,但就如何将GPS 有关信息读入计算机以便进一步处理和应用,仍是大家普遍关心的问题。虽然目前GPS 接收仪的种类、功能各有差异,而且使用的通讯协议也比较多,但许多GPS 生产商都遵循NMEA0183 协议,并且这些GPS 都提供串行通讯接口。笔者试图从分析GPS 通讯NMEA0183 协议入手,以计算机实时读取、显示、存储、回放GPS信息为例,探讨用VB 实现GPS 信息处理的一些方法。1 GPS 通讯的NMEA 协议GPS 的通讯协议比较多,其中NMEA (National Ma2rine Electronics Association) , 0183 协议为GPS 接收机和其他航海电子产品的导航数据输出格式,是目前普遍使用且为大多数生产商遵循的协议之一,以下为其基本通讯参数及报文格式。1. 1 GPS 串行通讯参数波特率= 4800 ;无奇偶校验;数据位= 8 ;停止位= 11. 2 NMEA 0183 报文格式NMEA 0183 协议报文的语句串(ASCII 字符) 格式全部信息可如下表示[1] :$AAXXX,ddd. . . ddd , 3 hh < CR > < LF >具体内容为:$ 串头,表示串开始AA 识别符XXX 语句名ddd ⋯ddd 数据字段,字母或数字, 逗号3 星号,串尾hh $与3 之间所有字符代码的校验和< CR > 回车控制符< LF > 换行控制符1. 3 报文示例说明在具体的GPS 应用中,不需要用到NMEA 的全部信息,而是根据具体的工作,从中选取所需的信息,忽略其他信息。在文献[ 1 ]中,给出了用NMEA0813 的$GPGGA语句的数据格式及示例,文中以GPS 推荐的最短数据$GPRMC 语句为例,具体讨论协议串中各数据段内容。1. 3. 1 当GPS 接收仪和卫星的通讯正常时接收到的数据中就包含如下格式的RMC 语句:$GPRMC,055142,A,3603.3291,N,10346.3723,E,0.0,230.4,250503,1.3,W,A *3 02其中数据分别为:$GPRMC 串头,其中RMC 为定位语句055142 表示UTC 24 小时制的标准时间,格式为“时时/分分/秒秒”。根据任务还需要将其转换为北京时间格式A 或V 表示信号接收状态,其中A表示数据“OK,V表示一个警告3603.3291 表示纬度值,格式为“ddmm.mmmm”N 或S 标明南北半球,N为北半球(北纬)、S为南半球(南纬)10346.3723 表示经度值,格式为“dddmm.mmmm”E 或W 标明东西半球,E为东半球(东经)、W为西半球(西经)0.0 表示速度, (这里速度为0)230.4 方位角,范围为000.0 到359.9度250503 为UTC 的日期,格式为“日日/月月/年年”1. 3 地磁变化(磁偏角) ,从000.0 到180.0度W 地磁变化方向,为E或W1. 3. 2当没有和卫星取得联系时RMC 语句的显示格式如下:$GPRMC, ,V, , , , , , ,270503 ,1.3,W,N *2B2 VB编程实现在应用VB 实现对GPS 数据接收和处理时,主要通过串行通讯方式,应用MSComm 控件完成。由于文中涉及内容较多,故只给出编程思想和核心程序段。2. 1 MSComm 控件应用2. 1. 1 端口设置由于GPS串行通讯参数是固定的“波特率=4800 ;无奇偶校验;数据位=8;停止位=1”,所以在编程时直接设置串口通讯参数就行了。其主要程序段如下[2] :’NMEA 协议设置MSComm1.Settings= “4800,N,8,1”2. 1. 2 数据采集OnComm 事件被用于捕获communications 事件及错误。因此可在MSComm 控件的OnComm 事件中加入处理函数,以便在文本框区实时显示、数据采集。Private Static Sub MSComm1 - OnComm() ’事件信息 Dim Buffer As Variant Buffer = MSComm1.Input ShowData txtTerm ,(StrConv(Buffer,vbUnicode))’在文本框txtTerm 内显示接收到的GPS 信息’ShowData 过程实现, 见2.2.4End Sub2. 2 GPS 信息显示的实现GPS 信息的显示实际包括两个方面,一是经过提取处理,显示需要的信息;二是在文本框内显示或记录全部信息(各种语句都显示) 。在程序实现上,为方便读取GPS信息, 并提高程序的复用性, 事先设计了两个类模块CparseUtils-wjh.cls,GPRMC-wjh.cls和一个标准模块modTransFun.bas ;同时也设计了一个在文本框区显示、采集数据的过程showdata。以下为主要功能或实现过程。2. 2. 1 CparseUtils-wjh 类该类主要用于求得语句串中数据段的数目和内容,包含两个函数:Function Count Parts ( sString As String , Optional sDelim AsString) As Byte ’用于返回协议语句中用“,”分割的段数Function Parse (ByVal sString As String , iReq As Integer , Op2tional sDelim As String) As String ’用于分割数据段内容2. 2. 2 GPRMC-wjh 类该类实现对接收到的语句进行判断,并确定各段字符的具体内容。除变量和其他属性定义外,最核心的一个方法,就是字串判断,下面列出其程序段:Public Property Let Sentence (ByVal RMC - Sentence As String)Dim Utils As New CparseUtils-wjh’检查正确的协议语句串头,以保证为$GPRMC 串If Utils.Parse (RMC- Sentence , 1) =“$GPRMC”Then ’变量定义部分从略 mvarSentence = RMC - Sentence’分析NMEA 并检查效果,如果不满足控制条件,返回并使变量值为空 sUTC = Utils.Parse (mvarSentence , 2) ’UTC 时间 If IsNumeric (sUTC) Then mvarUTC = sUTC End IfsLatitude = Utils.Parse (mvarSentence , 4) ’纬度 If IsNumeric (sLatitude) Then mvarLatitude = sLatitude End IfsLatHemis = Utils.Parse (mvarSentence , 5) ’南、北纬 If sLatHemis =“S”Or sLatHemis =“N”Then mvarLatHemis = sLatHemis End IfsLongitude = Utils. Parse (mvarSentence , 6) ’经度 If IsNumeric (sLongitude) Then mvarLongitude = sLongitude End IfsLonHemis = Utils. Parse (mvarSentence , 7) ’东、西经 If sLonHemis = “E”Or sLonHemis = ”W”Then mvarLonHemis = sLonHemis End IfsSpeed = Utils. Parse (mvarSentence , 8) ’速度 If IsNumeric (sSpeed) Then mvarSpeed = sSpeed End IfsUTDate = Utils. Parse (mvarSentence , 10) ’日期 If IsNumeric (sUTDate) Then mvarUTDate = sUTDate End If’⋯⋯其他判断类似,此处从略End If Set Utils = NothingEnd Property2. 2. 3 modTransFun 功能模块该模块给出了坐标格式转换函数及GPS 信息显示函数,它们分别为:Public Function DM2DD(DegreeMinutes As String) As Double’坐标格式转换函数,转换NMEA 协议的“度分”坐标格式为十进制“度度”格式’实现方法读者可自己完成下面主要介绍用于GPS 数据显示、回放时要用到的playNMEA 过程的实现方法:Public Sub playNMEA(sArray As Variant )’直接显示GPS 数据流,或回放已存在的NMEA 文件Dim rmc As GPRMC-wjhDim Utils As New CparseUtils - wjhDim Sentence As IntegerFor Sentence = 0 To sCnt - 1 If Utils. Parse (sArray(Sentence) , 1) =“$GPRMC”Then Set rmc = New GPRMC - wjhDoEventsWith rmc . Sentence = sArray(Sentence) If Not Val ( . Longitude) = 0 Then’lblX、lblY、lblSpeed、lblUTC、lblDate 分别为用于显示X、Y坐标,’速度,日期,时间的标签(Label) 控件’这里只示例了$GPRMC 中几个主要信息的提取,其他信息可如法炮制lblX. Caption = “X: ” & Format (DM2DD ( . Longitude ) ,“000. 0000”) &“”& . LonHemislblY. Caption =“Y: ”& Format (DM2DD( . Latitude) ,“ 00.0000”) &“”& . LatHemis lblSpeed. Caption =“速度: ”& . Speed &“ Km/ h” lblDate. Caption =“日期: ”& . UTDate lblUTC. Caption =“时间: ”& . UTC ’这个时间为UTC时间’根据任务可转换成北京时间 ElseMsgBox“接收卫星数太少,不能定位!”’⋯⋯’赋给lblX、lblY、lblSpeed、lblUTC、lblDate 空串 Exit Sub End IfEnd With End IfNext SentenceEnd Sub

评论