GPS串口数据接收程序实例

2023-05-16

GPS串口数据接收程序实例


摘 要:目前GPS(全球定位系统)定位应用市场日趋成熟,正在进入应用的高速发展时期。本文以一款EverMore公司的GM-X205GPS接受模块为例,介绍了其数据格式,以及应用PIC16F874单片机RS232串口进行数据接收的程序。
1、 GPS应用简介
    近年来GPS系统,已经在大地测绘、海上渔用、车辆定位监控、建筑、农业等各个领域得到广泛应用。从九十年代我国引进GPS定位技术开始,经过十多年的市场培育,GPS定位应用进入了发展的最好时机,未来十年基于GPS的应用将会改变我们的生活和工作方式。
    目前市场上的大部分GPS接受模块都是通过RS232串口与MCU进行数据传输的。这些数据包括经度、纬度、海拔高度、时间、卫星使用情况等基本信息。开发人员再依据这些基本数据,进行数据处理来完成整套的定位系统软件。
    2、 GM-X205模块数据格式
    在进行数据接受编程之前,先介绍一下该模块的数据格式。它支持NMEA-0183输出格式。信息如下:
    GGA位置测定系统定位资料(Global Positioning System Fix Data)
    GSV 导航卫星资料(GNSS Satellites in View)
    RMC导航卫星特定精简资料(Recommended Minimum Specific GNSS Data)
    VTG 方向及速度等相关资料(Course Over Ground and Ground Speed)
    由于文章篇幅问题,笔者在这里只以接收GGA数据为例,格式如下:
    $GPGGA,hhmmss,dddmm.mmmm,a,dddmm.mmmm,a,x,xx,x.x,x.x,M,,M,x.x,xxxx*CS
    例:$GPGGA,033744,2446.5241,N,12100.1536,E,1,10,0.8,133.4,M,,,,*1F
说明见表:

区域
名称
单位
说明
1
信息ID
$GPGGA
 
GGA协议开始
2
UTC时间
033744
 
hhmmss
3
纬度
2446.5241
 
dddmm.mmmm
4
南/北半球指示
N
 
N=north ; S=south
5
经度
12100.1536
 
dddmm.mmmm
6
东/西半球指示
E
 
E=east ; W=west
7
定位指示
1
 
0 =未定位
1=定位SPS模式
2=定位DGPS, SPS模式
8
应位卫星数
10
 
00-12
9
HDOP
0.8
 
10
海拔高度
133.4
 
11
海拔高度单位
M
 
12
WGS84水准面划分
 
 
 
13
WGS-84水准面划分单位
 
 
 
14
累计GPS数据微分
 
 
本模块中不可用
15
参考工作站ID
 
 
本模块中不可用
16
校验位
*1F
 
 

上面例子中,我们可读出位置信息:北纬24度46.5241分,西经121度00.1536分
                                格林威治时间:3点37分44秒
3、 PIC16F874数据接收程序
笔者在系统中把接收到的数据处理后,显示到图形液晶屏上。限于篇幅在这里只给出数据接收部分程序,并且只接收经度和时间信息,并且给出格林威治时间转换为北京时间的转换函数。其他数据接收程序类似。
;**********************************************************
;         THIS IS A GPS RECEIVER PROGRAM                  *
;**********************************************************
         LIST P=16F874
         INCLUDE P16F874.INC       
;*******寄存器定义 ********************
TEMP1     EQU    0X27
W_TEMP    EQU    0X54         
STATUS_TEMP  EQU 0X55
LONG1     EQU    0X40          ;LONG1--- LONG10经度的10位数据
LONG2     EQU    0X41
LONG3     EQU    0X42
LONG4     EQU    0X43
LONG5     EQU    0X44
LONG6     EQU    0X45
LONG7     EQU    0X46
LONG8     EQU    0X47
LONG9     EQU    0X48
LONG10    EQU    0X49
T1        EQU    0X58           ;T1---T6时间的6位数据
T2        EQU    0X59
T3        EQU    0X60
T4        EQU    0X61
T5        EQU    0X62
T6        EQU    0X63
;********************************************************
       ORG  00H
       NOP
       NOP
       GOTO MAIN
       ORG  04H          ;设定按中端健才开始数据接受
       NOP
       NOP
       GOTO INTERRUPT
;*********判断头文件是不是‘$GPGGA’**********
IDMESSAGE
        BCF     STATUS,RP0
BREAK0 
     CALL      PAND
        MOVWF     TEMP1
        MOVLW     ‘$‘        ;detect $
        SUBWF     TEMP1,0
        BTFSS     STATUS,Z
        GOTO   BREAK0
        CALL     PAND
        MOVWF     TEMP1
        MOVLW     ‘G‘        ;detect G
        SUBWF     TEMP1,0
        BTFSS     STATUS,Z
        GOTO   BREAK0
        CALL     PAND
        MOVWF     TEMP1
        MOVLW     ‘P‘        ;detect P
        SUBWF     TEMP1,0
        BTFSS     STATUS,Z
        GOTO  BREAK0
        CALL     PAND
        MOVWF     TEMP1
        MOVLW     ‘G‘        ;detect G
        SUBWF     TEMP1,0
        BTFSS     STATUS,Z
        GOTO  BREAK0
        CALL     PAND
        MOVWF     TEMP1
        MOVLW     ‘G‘        ;detect G
        SUBWF     TEMP1,0
        BTFSS     STATUS,Z
        GOTO  BREAK0
        CALL     PAND
        MOVWF     TEMP1
        MOVLW     ‘A‘        ;detect A
        SUBWF     TEMP1,0
        BTFSS     STATUS,Z
        GOTO  BREAK0
        CALL     PAND        ;跳过逗号
        RETURN
;************接收函数******************
RECEIVE
       CALL     PAND                    ;开始时间数据接收
       MOVWF    T1
       CALL     PAND
       MOVWF    T2
       CALL     PAND
       MOVWF    T3
       CALL     PAND
       MOVWF    T4
       CALL     PAND
       MOVWF    T5
       CALL     PAND
       MOVWF    T6                      ;时间数据接收完成
       CALL     PAND                     ;跳过逗号
       CALL     PAND                     ;跳过10位纬度数据---开始
       CALL     PAND
CALL     PAND
       CALL     PAND                    
       CALL     PAND
       CALL     PAND
       CALL     PAND                    
       CALL     PAND
       CALL     PAND
       CALL     PAND                     ;跳过10位纬度数据---结束
       CALL     PAND                     ;跳过逗号
       CALL     PAND                     ;跳过南/北纬判断位数据
       CALL     PAND                     ;跳过逗号
       CALL     PAND                     ;接受经度信号开始
       MOVWF    LONG1
       CALL     PAND
       MOVWF    LONG2
       CALL     PAND
       MOVWF    LONG3
       CALL     PAND
       MOVWF    LONG4
       CALL     PAND
       MOVWF    LONG5
       CALL     PAND
       MOVWF    LONG6
       CALL     PAND
       MOVWF    LONG7
       CALL     PAND
       MOVWF    LONG8
       CALL     PAND
       MOVWF    LONG9
       CALL     PAND
       MOVWF    LONG10                   ;接受经度信号结束
       RETURN
;***************串口寄存器中是否数据*****************
PAND  
        BCF      STATUS,RP0
CC   BTFSS PIR1,5
        GOTO CC
        MOVF     RCREG,0
        RETURN
;*****************中断函数***************************
INTERRUPT    
        BCF INTCON,7                  ;SET GIE=0屏蔽所有中端
        BCF     STATUS,RP0
        BCF     RCSTA,1               ;清除溢出错误位
        BSF       STATUS,RP0
        BCF       TXSTA,2             ;BRGH=0 Low speed
        BCF       TXSTA,4             ;Set Asynchronous mode
        MOVLW     0X0C
        MOVWF     SPBRG             ;设置波特率为4800
        BCF       STATUS,RP0
        MOVLW     B‘10010000‘
        MOVWF     RCSTA             ;串口接收相关设置
        BSF       STATUS,RP0         
        BSF       OPTION_REG,6        ; RB0/INT 引脚上升沿中断
       MOVWF W_TEMP            
    SWAPF STATUS,W
    BCF   STATUS,RP0
    MOVWF STATUS_TEMP
    BCF     STATUS,RP0
    CALL    IDMESSAGE
       CALL    RECEIVE
        BCF     STATUS,RP0
        CLRF    RCSTA                ;清除串口设置
        CALL    CONVERT             ;调用时间转换函数
OUT BCF STATUS,RP0             ;跳出中断部分,恢复寄存器
     SWAPF STATUS_TEMP,W
     MOVWF STATUS
     SWAPF W_TEMP,F
     SWAPF W_TEMP,W  
     BSF  INTCON,7     ;SET GIE=1允许所有中端
     NOP 
        RETFIE
;************ 格林威治时间转换为北京时间******************
CONVERT
       MOVLW  A‘0‘
       SUBWF  T2,1
       SUBWF  T1,1
       MOVLW  D‘10‘
       MOVWF  TEMP1
LOOP1  MOVF   TEMP1,0
       MOVF   TEMP1,1
       BTFSS  STATUS,Z
       GOTO   ADD10
       MOVLW  D‘8‘
       ADDWF  T2,1
       MOVLW  D‘24‘
       SUBWF  T2,1
       BTFSC  STATUS,C
       GOTO   CON1
       ADDWF  T2,1
       GOTO   CON1
CON1   MOVLW  D‘20‘
       MOVWF  TEMP1
       SUBWF  T2,0
       BTFSS  STATUS,C
       GOTO   CON2
       MOVWF  T2
       MOVLW  0X02
       MOVWF  T1
       GOTO   HALT1
CON2   MOVLW  D‘10‘
       MOVWF  TEMP1
       SUBWF  T2,0
       BTFSS  STATUS,C
       GOTO   CON3
       MOVWF  T2
       MOVLW  0X01
       MOVWF  T1
       GOTO   HALT1
CON3   MOVLW  0X00
       MOVWF  T1
HALT1  MOVLW  A‘0‘
       ADDWF  T1,1
       ADDWF  T2,1
       RETURN
ADD10  MOVF   T1,0
       ADDWF  T2,1
       DECF   TEMP1,1
       GOTO   LOOP1
       RETURN
;******************MAIN***********************
MAIN
        BCF       STATUS,RP0
        MOVLW     B‘10010000‘
        MOVWF     INTCON            ;打开中断
        LOOP NOP
     BCF     STATUS,RP0
     GOTO  LOOP
     GOTO MAIN
        END
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GPS串口数据接收程序实例 的相关文章

  • Geopy:计算 GPS 航向/方位

    第一次在这里发海报 我正在对桥梁检查 ROV 八旋翼收集的 GPS 数据进行一些数据分析 我们有八旋翼在运行ROS http 20www ros org wiki 使用 3D 扫描激光雷达 立体视觉 INS 和其他一些巧妙的技术 我目前正在
  • 如何从Python中的GPS不分段时间获取当前日期和时间

    我有这样的 GPS 未分段时间 Tgps 1092121243 0 我想知道那是什么日期和时间 GPS时间的起始时间是1980年1月6日 Python函数 datetime utcfromtimestamp 可以给出 1970 年 1 月
  • Android GPS 查询位置数据不正确

    我没有为此使用模拟位置 事实上 代码上周运行良好 我有一个应用程序 它收集 GPS 数据并使用应用程序本身生成的 X Y 坐标输出谷歌地图链接 我不是 100 确定为什么它没有按应有的方式工作 但是当我请求应用程序根据手机提供的 GPS 位
  • 在 C# 中从图像的 EXIF 获取 GPS 数据

    我正在开发一个系统 允许使用 ASP NET C 将图像上传到服务器 我正在处理图像 一切正常 我设法找到一种方法来读取创建日期 EXIF 数据并将其解析为日期时间 这也很好用 我现在正在尝试从 EXIF 读取 GPS 数据 我想捕获纬度和
  • 如何通过 GPS 检查距 x,y 位置 10 米的半径

    我从 GPS 得到这个位置 40 715192 74 005795 如何判断i是否在10米半径范围内 提前致谢 使用半正矢公式http en wikipedia org wiki Haversine formula http en wiki
  • 如何在 JavaScript 中查找到已知位置的距离

    在浏览器中使用 JavaScript 如何确定从我当前位置到另一个我有纬度和经度的位置的距离 如果您的代码在浏览器中运行 您可以使用 HTML5 地理定位 API window navigator geolocation getCurren
  • GPS 应用程序在 iOS 5 上停止工作 - 位置管理器未更新

    我开发了一个针对 iOS 4 3 的应用程序 效果很好 但自从我迁移到 iOS 5 0 以来 该应用程序开始表现出奇怪的行为 位置管理器不显示位置变化的更新 有人遇到过这种问题吗 谢谢你的帮助 我与 CLLocation 经理共享票价 出现
  • 如何停止位置管理器?

    不知道为什么 但有时 LocationManager 在关闭应用程序后仍然工作 我在一个 Activity 的 onCreate Methode 中调用 startGPS 只有一个 让我称之为 StartActivity protected
  • C#:GPS跟踪系统[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在 C net 中构建带有移动设备 带 GPS 的 GPS 跟踪系统 场景是 通过支持 GPS 的手机跟踪用户 服务工程师 这里没
  • 设置模拟位置时 GPS 提供商未知错误?

    我正在尝试设置我的模拟位置 但是 我收到以下错误 提供商 gps 未知 并且不确定出了什么问题 我已经获得了在manifest xml 中声明的所有权限以及所有参数 模拟定位法 Initiates the method to set the
  • 使用 LocationManager 时,为什么打开 Wifi 但未连接有助于网络定位?

    这可能是偏离主题的 如果是这样 我道歉 并很高兴接受关闭标志 但我在弄清楚为什么 WIFI 打开但未连接到任何接入点 在我的 Android 设备上 时遇到问题 它vastly提高网络提供商使用时的准确性LocationManager 如果
  • 在设备所有者应用程序中启用 GPS

    根据API文档 https developer android com reference android app admin DevicePolicyManager html setSecureSetting android conten
  • Android 应用无法获取位置权限

    我的清单中有以下内容
  • 从 GPS 坐标获取城市名称

    我想从 GPS 坐标获取城市的名称 我可以使用 Google API 获取 GPS 点的详细信息 http maps googleapis com maps api geocode output parameters 输出是 XML 但我不
  • 在不改变我的位置的情况下获取当前位置的经度和纬度

    我可以找到当前位置的纬度和经度 但是这些数据在更改我的当前位置之前不会显示 我想在不更改我的位置的情况下获取当前位置的经度和纬度 package com example gps import android app Activity imp
  • C# - LINQ - GPS 纬度和经度的最短距离

    我有数据库 其中有带有 GPS 坐标的一流酒店 我想获得距离我选择的坐标最近的地方 我认为它应该看起来像这样 我在这里找到了很多示例代码 就像这样 var coord new GeoCoordinate latitude longitude
  • 使用纬度/经度计算从 A 点到线段的距离

    我正在开发一个使用 GPS 的 Android 应用程序 我想知道如果 新位置 C 点 距离线段 AB 太远 是否有办法可以丢弃 GPS 位置数据 我正在使用发现的点到线段公式在维基百科上 http en wikipedia org wik
  • 使用 Google 电子表格中的脚本从手机获取我的当前位置

    有没有办法使用 Google Apps 脚本从手机的 GPS 数据中获取我的当前位置 纬度和经度 最好是十进制形式 另外 是否可以打开和关闭 GPS 或者至少检测它是否打开或关闭 这是我尝试做的 我带着电动助力车去一些地方 在每个地方我都会
  • Swift 将十进制坐标转换为度、分、秒、方向

    我怎样才能将其转换为快速 我最好的猜测是所有 int 都变成了 var 删除所有导致 的 此外 如果有的话可以给我指出一个很好的来源来了解事物如何转换 那就太好了 NSString coordinateString int latSecon
  • 关闭应用程序后如何调试

    我正在尝试重现问题 这需要在特定位置关闭并重新打开我的应用程序 这是我的问题 1 如何查看我的日志 使用NSLog命令 当我的 iPhone 未连接到 XCode 时 2 是否可以将iPhone模拟器的特定位置 例如市中心 设置为默认位置

随机推荐

  • [python]异常处理与try语句

    文章目录 异常处理try语句异常信息抛出异常 异常类型自定义异常预定义异常 使用 try except else 来捕获异常 xff0c 且要求异常必须继承自Exception类 异常处理 运行期检测到错误称为异常 try语句 python
  • 大杂烩·OSI和TCP/IP协议与ZigBee技术·一

    1 ZigBee技术 ZigBee是基于IEEE802 15 4标准的低功耗局域网协议 根据国际标准规定 xff0c ZigBee技术是一种短距离 低功耗的无线通信技术 这一名称 xff08 又称紫蜂协议 xff09 来源于蜜蜂的八字舞 x
  • Linux Shell 实现一键部署subversion

    subversion SVN是subversion的缩写 xff0c 是一个开放源代码的版本控制系统 xff0c 通过采用分支管理系统的高效管理 xff0c 简而言之就是用于多个人共同开发同一个项目 xff0c 实现共享资源 xff0c 实
  • PowerShell install 一键部署TortoiseSVN

    TortoiseSVN TortoiseSVN是 Subversion 版本控制系统的一个免费开源客户端 xff0c 可以超越时间的管理文件和目录 文件保存在中央版本库 xff0c 除了能记住文件和目录的每次修改以外 xff0c 版本库非常
  • PowerShell install 一键部署subversion

    subversion SVN是subversion的缩写 xff0c 是一个开放源代码的版本控制系统 xff0c 通过采用分支管理系统的高效管理 xff0c 简而言之就是用于多个人共同开发同一个项目 xff0c 实现共享资源 xff0c 实
  • ROS(1)安装

    1 ros安装 安装过程参考https www cnblogs com letisl p 11815191 html安装wsl略 xff0c 利用mobaxterm进行连接与可视化 1 1 添加源 sudo sh c 39 etc lsb
  • ROS(11)move_base详解

    11 move base详解 11 1 move base配置参数解读 参考链接 xff1a https blog csdn net banzhuan133 article details 90239252 https wenku baid
  • vscode c/c++ global插件实现代码跳转

    问题 在打开某些大的工程 xff0c 如ROS时 xff0c 有些类成员或接口无法进行自动跳转 xff0c 比较难受 vscode插件安装 安装C C 43 43 GNU Global插件 安装C 43 43 Intellsense插件 G
  • gammaray剖析QT程序——如何解析qt版本不同的exe

    gammaray是个非常牛逼的工具 xff0c 但是当我们要分析的exe和当前编译gammaray不一致时 xff0c 是没法使用的 方法很简单 xff0c 其实版本和exe无关 xff0c 和exe依赖的qt dll库有关 xff0c 我
  • do{}while(0)用法

    linux内核和其他一些开源的代码中 xff0c 经常会遇到这样的代码 xff1a do while 0 这样的代码一看就不是一个循环 xff0c do while表面上在这里一点意义都没有 xff0c 那么为什么要这么用呢 xff1f 实
  • windows下vscode安装go插件

    1 GIT安装 vscode安装 略 2 GO在win下安装及环境变量配置 安装完GO后 xff0c 创建一个目录作为工作区 xff0c 如G my project go xff0c 环境变量添加GOPATH并指向该目录 在该目录下创建三个
  • GDB调试中 如何在so共享库中打断点、保存断点以及加载断点

    最近在使用gdb的过程中 xff0c 需要对so文件进行调试 xff0c 在这里记录一下调试中的问题及解决方法 如何在so源文件中打断点 xff1f 首先编译so时需要 g指令 在gdb xxx指令后 xff0c 发现无法在so对应的源码文
  • [Net]SSE消息推送简介

    文章目录 SSE网络协议客户端服务端事件 SSE示例客户端服务端 SSE xff08 Server Sent Events xff09 是一种服务端到客户端 xff08 浏览器 xff09 的单向消息推送方式 SSE网络协议 SSE是基于H
  • 记录一次Windows下通过reimp和dlltool转换.lib到.a的过程

    背景是这样的 xff1a 在linux下的一个C 43 43 服务由于特殊原因 xff0c 需要在windows下跑 xff0c 该工程为cmake搭建 xff0c 用到了qt的一些基础库 xff0c 我们想在qtcreator中用ming
  • DGPS知识详解

    什么是DGPS xff1f DGPS Difference Global Positioning System英文单词的缩写 xff0c 即差分全球定位系统 由于当前GPS全球卫星定位系统精度不能满足人们定位导航的需要 xff0c 因此 x
  • CMake 指定gcc编译版本

    修改 CMakeLists txt 文件 xff0c 添加如下命令 SET CMAKE C COMPILER home hhb gcc 5 2 0 bin gcc SET CMAKE CXX COMPILER home hhb gcc 5
  • 避免头文件的多重包含

    避免头文件的多重包含 通过预处理器变量 xff0c 我们可以以头文件保护符的形式避免在已经见到头文件的情况下重新处理该头文件的内容 使用预处理器变量作为头文件保护符 预处理器变量有两种状态 xff1a 已定义与未定义 define指示接受一
  • 空气动力与电机力学

    空气动力学 1 空气阻力的公式 xff1a F 61 1 2 C SV 2 式中 xff1a C为空气阻力系数 xff1b 为空气密度 xff1b S物体迎风面积 xff1b V为物体与空气的相对运动速度 由上式可知 正常情况下空气阻力的大
  • java学习记录

    前言 Java系列课之基础入门 xff1a 钟洪发老师JAVA零基础入门笔记 JAVA学习指导 00 关于Java学习的一个开场白 01 常用dos命令和ava环境软件下载 在开始学习java之前 我们必须掌握一些常用的dos命令 一 di
  • GPS串口数据接收程序实例

    GPS串口数据接收程序实例 摘 要 xff1a 目前GPS xff08 全球定位系统 xff09 定位应用市场日趋成熟 xff0c 正在进入应用的高速发展时期 本文以一款EverMore公司的GM X205GPS接受模块为例 xff0c 介