正文

用VB实现GPS信息处理2013-08-08 23:32:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/enc999/54283.html

分享到:

引 言                                     
        目前,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 …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 , 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 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
’……其他判断类似,此处从略
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“接收卫星数太少,不能定位!”
                      ’……
’赋给lblX、lblY、lblSpeed、lblUTC、lblDate   空串
                                              Exit Sub
                       End If
                      End With
                       End If
                      Next Sentence
                      End   Sub
              
’如果需要记录数据到文件
                             
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 报文   ,并录入到记录文件中;若执行“关闭记录文件”,则关闭记录文件(但文本框中仍然显示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 Access 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   信息的文件打开,并重新读取、显示其信息的过程。它包括一个打开过程和一个播放过程。具体实现代码如下(要用到前面给出的模块中的方法) :

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   个数据段就是高程信息。

阅读(3709) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册