用VB 实现GPS 信息处理1

发表于:2007-05-25来源:作者:点击数: 标签:信息处理GPS实现
用VB 实现GPS 信息处理 0 引 言 目前,GPS 已在许多行业和领域得到广泛应用,但就如何将GPS 有关信息读入计算机以便进一步处理和应用,仍是大家普遍关心的问题。虽然目前GPS 接收仪的种类、功能各有差异,而且使用的通讯协议也比较多,但许多GPS 生产商都遵循NMEA

用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 ;停止位= 1

1. 2  NMEA 0183 报文格式

NMEA 0183 协议报文的语句串(ASCII 字符) 格式全部信息可如下表示[1] :

$AAXXX,ddd. . . ddd , 3 hh < CR > < LF >

具体内容为:

$ 串头,表示串开始

AA  识别符

XXX 语句名

ddd &#8943;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或W

1. 3. 2当没有和卫星取得联系时

RMC 语句的显示格式如下:

$GPRMC, ,V, , , , , , ,270503 ,1.3,W,N *2B

2  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.4

End Sub

2. 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 As

String) As Byte  ’用于返回协议语句中用“,”分割的段数

Function Parse (ByVal sString As String , iReq As Integer , Op2

tional 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 If

sLatitude = Utils.Parse (mvarSentence , 4) ’纬度

  If IsNumeric (sLatitude) Then

   mvarLatitude = sLatitude

  End If

sLatHemis = Utils.Parse (mvarSentence , 5) ’南、北纬

  If sLatHemis =“S”Or sLatHemis =“N”Then

   mvarLatHemis = sLatHemis

  End If

sLongitude = Utils. Parse (mvarSentence , 6) ’经度

  If IsNumeric (sLongitude) Then

   mvarLongitude = sLongitude

  End If

sLonHemis = Utils. Parse (mvarSentence , 7) ’东、西经

  If sLonHemis = “E”Or sLonHemis = ”W”Then

   mvarLonHemis = sLonHemis

  End If

sSpeed = Utils. Parse (mvarSentence , 8) ’速度

  If IsNumeric (sSpeed) Then

   mvarSpeed = sSpeed

  End If

sUTDate = Utils. Parse (mvarSentence , 10) ’日期

  If IsNumeric (sUTDate) Then

   mvarUTDate = sUTDate

  End If

’&#8943;&#8943;其他判断类似,此处从略

End If

 Set Utils = Nothing

End Property

2. 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-wjh

Dim Utils As New CparseUtils - wjh

Dim Sentence As Integer

For Sentence = 0 To sCnt - 1

 If Utils. Parse (sArray(Sentence) , 1) =“$GPRMC”Then

 Set rmc = New GPRMC - wjh

DoEvents

With 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”) &“”& . LonHemis

lblY. Caption =“Y: ”& Format (DM2DD( . Latitude) ,“ 00.0000”) &“”& . LatHemis

 lblSpeed. Caption =“速度: ”& . Speed &“ Km/ h”

 lblDate. Caption =“日期: ”& . UTDate

 lblUTC. Caption =“时间: ”& . UTC ’这个时间为UTC时间

’根据任务可转换成北京时间

 Else

MsgBox“接收卫星数太少,不能定位!”

’&#8943;&#8943;

’赋给lblX、lblY、lblSpeed、lblUTC、lblDate 空串

 Exit Sub

 End If

End With

 End If

Next Sentence

End Sub

2. 2. 4  ShowData 过程

该过程具体实现GPS 信息在文本框区显示、采集的功能,它通过添加数据到txt Term 控件的Text 属性,过滤控制字符,如空格、回车、换行, 并且写数据到一个打开的记录文件。空格符从它的左侧删除,在Text 属性, 或

者从传递字符串中;换行符将被修改为回车; txt Term 控件的Text 属性的尺寸也被监视,使它不能超过MAX2TERMSIZE 的要求。其实现过程如下:

Private Static Sub ShowData ( Term As Control , Data As String)

On Error GoTo Handler

Const MAXTERMSIZE = 16000

Dim TermSize As Long , i

’以下为显示GPS 信息时用的变量

Dim InString As String

Dim Utils As New CParseUtils

Dim tempStr As String

Dim n As Integer

Dim cnt As Integer

’确定现存的文本不会太大

TermSize = Len ( Term. Text )

If TermSize > MAXTERMSIZE Then

 Term. Text = Mid $( Term. Text , 4097)

 TermSize = Len ( Term. Text )

End If

’指到txt Term 的数据的结尾处

Term. SelStart = TermSize

’过滤/ 处理空格符

Do

 i = InStr (Data , Chr $(8) )

 If i Then

   If i = 1 Then

    Term. SelStart = TermSize - 1

    Term. SelLength = 1

    Data = Mid $(Data , i + 1)

   Else

    Data = Left $(Data , i - 2) & Mid $(Data , i +1)

   End If

 End If

Loop While i

’除去换行符

Do

 i = InStr (Data , Chr $(10) )

 If i Then

   Data = Left $(Data , i - 1) & Mid $(Data , i + 1)

 End If

Loop While i

’确定所有的回车都包含换行符

i = 1

Do

 i = InStr (i , Data , Chr $(13) )

 If i Then

   Data = Left $(Data , i) & Chr $(10) & Mid $(Da2ta , i + 1)

   i = i + 1

 End If

Loop While i

’添加过滤的数据到SelText 属性

Term. SelText = Data

 ’如果需要记录数据到文件

If hLogFile Then

 i = 2

 Do

   Err = 0

   Put hLogFile , , Data

   Dim data0 As String

   If Err Then

    i = MsgBox( Error $, 21)

    If i = 2 Then

      mnuCloseLog - Click

    End If

   End If

 Loop While i < > 2

End If

Term. SelStart = Len ( Term. Text ) ’定位信息显示部分开始

InString = Data

cnt = Utils. Count Parts ( InString , Chr (10) )

  For n = 0 To cnt - 1

   tempStr = Utils. Parse ( InString , n , Chr (10) )

    ReDim Preserve sArray(n)

    sArray(n) = tempStr

  Next n

  Set Utils = Nothing

  sCnt = cnt

  Call playNMEA(sArray) ’显示部分结束

Exit Sub

Handler :

MsgBox Error $

Resume Next

End Sub

2. 3  实时记录和保存GPS 数据

程序运行时,如执行“打开记录文件”,则打开要记录的文件和端口,在GPS 信息区实时显示接收到的GPS 报文[ 2 ] ,并录入到记录文件中;若执行“关闭记录文件”,则关闭记录文件(但文本框中仍然显示GPS 信息) 。

Private Sub mnuOpenLog - Click()

’执行“打开记录文件”

 Dim replace

 On Error Resume Next

 With OpenLog ’CommonDialog 控件

    . Flags = cdlOFNHideReadOnly Or cdlOFNExplorer

    . CancelError = True    ’从用户处获得记录

文件名称

    . DialogTitle = “打开记录文件”

    . Filter = “文件格式1 ( 3 . LOG) | 3 . log| 文件格式2 ( 3 . txt) | 3 . txt| 文件格式3 ( 3 . 3 ) | 3 . 3 ”

 End With

 Do

   OpenLog. FileName = “”

   OpenLog. ShowOpen

   If Err = cdlCancel Then Exit Sub

   Temp = OpenLog. FileName

   ’如果文件已经存在, 询问用户是否希望覆盖此文件或在此文件基础上添加内容

   Ret = Len (Dir $( Temp) )

   If Err Then

    MsgBox Error $, 48

    Exit Sub

   End If

   If Ret Then

    replace = MsgBox(“代替存在的- ”+ Temp +“吗?”, 35)

   Else

    replace = 0

   End If

 Loop While replace = 2

 ’用户单击“确定”按钮, 则删除此文件

 If replace = 6 Then

   Kill Temp

   If Err Then

    MsgBox Error $, 48

    Exit Sub

   End If

 End If

 ’打开记录文件

 hLogFile = FreeFile

 Open Temp For Binary Aclearcase/" target="_blank" >ccess Write As hLogFile

 If Err Then

   MsgBox Error $, 48

   Close hLogFile

   hLogFile = 0

   Exit Sub

 Else

   ’到文件结尾处来添加新数据

   Seek hLogFile , LOF(hLogFile) + 1

 End If

End Sub

Private Sub mnuCloseLog - Click()

’执行“关闭记录文件”

  Close hLogFile

  hLogFile = 0

End Sub

2. 4  回放GPS 数据

GPS 数据的回放,是将存有GPS 信息的文件打开,并重新读取、显示其信息的过程。它包括一个打开过程[ 2 ]和一个播放过程。具体实现代码如下(要用到前面给出的模块中的方法) :

Private Sub mnuOpenBFile - Click()

’读取存有GPS 信息的回放文件

  Dim sFile As String

Dim Sentence

On Error GoTo errorhandle

With OpenBFile

    ’从用户处获得回放文件名称

    . DialogTitle = “打开回放文件”

    . Filter = “文件格式1 ( 3 . LOG) | 3 . log| 文件格式2 ( 3 . txt) | 3 . txt| 文件格式3 ( 3 . 3 ) | 3 . 3 ”

    . ShowOpen

    If Len( . FileName) = 0 Then

      Exit Sub

    End If

      sFile = . FileName

    End With

    Open sFile For Input As # 1

    sCnt = 0

     Do While Not EOF (1)

       Line Input # 1 , Sentence

       ReDim Preserve sArray(sCnt)

       sArray(sCnt) = Sentence

       sCnt = sCnt + 1

     Loop

Close # 1

 Exit Sub

errorhandle :

  Close # 1

  MsgBox“打开文件错误!”

End Sub

Private Sub mnuPlayBFile - Click()

’播放GPS 记录文件

Call playNMEA(sArray)

End Sub

3  结 论

通过对GPS 通讯NMEA 协议的分析,以RMC 语句的“$GPRMC”串为例,给出了开发GPS 数据处理的方法。该方法具有简单、高效、实用的特点。需要说明的是,用RMC 语句不能读取高程数据,如果要在应用中读取高程数据, 可应用文中的方法, 再编写一个读GGA 语句(“$GPGGA”串) 的类,其中第9 个数据段就是高程信息。


原文转自:http://www.ltesting.net