正文

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

阅读(5425) | 评论(0)


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

评论

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