摘要: 本文提出了一种在VC下实现对GPS全球定位系统定位信息的接收以及对各定位参数数据的提取方法。
引言
卫星导航技术的飞速发展已逐渐取代了无线电导航、天文导航等传统导航技术,而成为一种普遍采用的导航定位技术,并在精度、实时性、全天候等方面取得了长足进步。现不仅应用于物理勘探、电离层测量和航天器导航等诸多民用领域,在军事领域更是取得了广泛的应用--在弹道导弹、野战指挥系统、精确弹道测量以及军用地图快速测绘等领域均大量采用了卫星导航定位技术。有鉴于卫星导航技术在民用和军事领域的重要意义,使其得到了许多国家的关注。我国也于2000年10月31日和12月21日成功发射了第一颗和第二颗导航定位试验卫星并建立了我国第一代卫星导航定位系统--"北斗导航系统",但由于起步晚也没有得到广泛应用。目前在我国应用最多的还是美国的GPS系统。本文就针对当前比较普及的GPS系统,对其卫星定位信息的接收及其定位参数提取的实现方法予以介绍。
定位信息的接收
通常GPS定位信息接收系统主要由GPS接收天线、变频器、信号通道、微处理器、存储器以及电源等部分组成。由于GPS定位信息内容较少,因此多用RS-232串口将定位信息(NEMA0183语句)从GPS接收机传送到计算机中进行信息提取处理。从串口读取数据有多种方法,在此直接使用 Win32 API函数对其进行编程处理。在Windows下不允许直接对硬件端口进行控制操作,所有的端口均被视为"文件",因此在对串口进行侦听之前需要通过打开文件来打开串口,并对其进行相关参数配置:
m_hCom=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED,NULL); file://以异步方式打开COM1口
SetCommMask (m_hCom, EV_RXCHAR ) ; file://添加或修改Windows所报告的事件列表
SetupComm (m_hCom,READBUFLEN/*读缓冲*/,WRITEBUFLEN/*写缓冲*/); // 初始化通讯设备参数
// 清除缓冲信息
PurgeComm (m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR) ;
// 对异步I/O进行设置
CommTimeOuts.ReadIntervalTimeout = MAXDWORD ; file://接收两连续字节的最大时间间隔
CommTimeOuts.ReadTotalTimeoutMultiplier =0; file://接收每字节的平均允许时间
CommTimeOuts.ReadTotalTimeoutConstant = 0 ; file://接收时间常数
SetCommTimeouts (m_hCom , &CommTimeOuts) ;
file://获取并设置串口
GetCommState ( m_hCom, &dcb) ;
dcb.BaudRate = CBR_4800;
dcb.ByteSize = 8;
dcb.Parity = ODDPARITY;
dcb.StopBits = ONESTOPBIT ;
SetCommState( m_hCom, &dcb);
在成功打开并设置通讯口后,可采取轮询串口和事件触发两种方式对数据进行接收处理,本文在此采取效率比较高的事件触发方式进行接收处理,通过等待EV_RXCHAR事件的发生来启动ReadFile函数完成对GPS定位信息的接收:
while(true){
WaitCommEvent (m_hCom,&dwEvtMask,NULL);
if (dwEvtMask&EV_RXCHAR == EV_RXCHAR)
if(ComStat.cbInQue>0)
ReadFile(m_hCom,m_readbuf,ComStat.cbInQue,&nLength,&olRead);
}
提取定位数据
GPS接收机只要处于工作状态就会源源不断地把接收并计算出的GPS导航定位信息通过串口传送到计算机中。前面的代码只负责从串口接收数据并将其放置于缓存,在没有进一步处理之前缓存中是一长串字节流,这些信息在没有经过分类提取之前是无法加以利用的。因此,必须通过程序将各个字段的信息从缓存字节流中提取出来,将其转化成有实际意义的,可供高层决策使用的定位信息数据。同其他通讯协议类似,对GPS进行信息提取必须首先明确其帧结构,然后才能根据其结构完成对各定位信息的提取。对于本文所使用的GARMIN GPS天线板,其发送到计算机的数据主要由帧头、帧尾和帧内数据组成,根据数据帧的不同,帧头也不相同,主要有"$GPGGA"、"$GPGSA"、"$GPGSV"以及"$GPRMC"等。这些帧头标识了后续帧内数据的组成结构,各帧均以回车符和换行符作为帧尾标识一帧的结束。对于通常的情况,我们所关心的定位数据如经纬度、速度、时间等均可以从"$GPRMC"帧中获取得到,该帧的结构及各字段释义如下:
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>*hh
<1> 当前位置的格林尼治时间,格式为hhmmss
<2> 状态, A 为有效位置, V为非有效接收警告,即当前天线视野上方的卫星个数少于3颗。
<3> 纬度, 格式为ddmm.mmmm
<4> 标明南北半球, N 为北半球、S为南半球
<5> 径度,格式为dddmm.mmmm
<6> 标明东西半球,E为东半球、W为西半球
<7> 地面上的速度,范围为0.0到999.9
<8> 方位角,范围为000.0到 359.9 度
<9> 日期, 格式为ddmmyy
<10> 地磁变化,从000.0到 180.0 度
<11> 地磁变化方向,为E 或 W
至于其他几种帧格式,除了特殊用途外,平时并不常用,虽然接收机也在源源不断地向主机发送各种数据帧,但在处理时一般先通过对帧头的判断而只对"$GPRMC"帧进行数据的提取处理。如果情况特殊,需要从其他帧获取数据,处理方法与之也是完全类似的。由于帧内各数据段由逗号分割,因此在处理缓存数据时一般是通过搜寻ASCII码"$"来判断是否是帧头,在对帧头的类别进行识别后再通过对所经历逗号个数的计数来判断出当前正在处理的是哪一种定位导航参数,并作出相应的处理。下面就是对缓存Data中的数据进行解帧处理的主要代码,本文在此只关心时间(日期和时间)和地理坐标(经、纬度):
for(int i=0;i<DATALENGTH;I++){
if(Data[i]=='$') file://帧头,SectionID为逗号计数器
SectionID=0;
if(Data[i]==10){ file://帧尾
}
if(Data[i]==',') file://逗号计数
SectionID++;
else {
switch(SectionID){
case 1: file://提取出时间
m_sTime+=Data[i];
break;
case 2: file://判断数据是否可信(当GPS天线能接收到有3颗GPS卫星时为A,可信)
if(Data[i]=='A')
GPSParam[m_nNumber].m_bValid=true;
break;
case 3: file://提取出纬度
m_sPositionY+=Data[i];
break;
case 5: file://提取出经度
m_sPositionX+=Data[i];
break;
case 9: file://提取出日期
m_sDate+=Data[i];
break;
default:
break;
}
}
}
现在已将所需信息提取到内存,即时间、日期以及经纬度分别保存在CString型变量 m_sTime、m_Data、m_sPositionY和m_sPositionX中。在实际应用中往往要根据需要对其做进一步的运算处理,比如从GPS接收机中获得的时间信息为格林尼治时间,因此需要在获取时间上加8小时才为我国标准时间。而且GPS使用的WGS-84坐标系也与我国采用的坐标系不同,有时也要对此加以变换。而这些变换运算必须通过数值运算完成,因此需要将前面获取的字符型变量转化为数值型变量,这部分工作可放在检测到帧尾完成:
::strcpy(buf,m_sTime);
str.Format("%c%c",buf[0],buf[1]);
GPSParam[m_nNumber].m_nHour=(atoi(str)+8)%24; file://提取出小时并转化为24小时制北京时间
file://buf第2、3字节为分钟,4、5字节为秒,提取方法同上
……
::strcpy(buf,m_sDate);
str.Format("%c%c",buf[0],buf[1]); file://提取出月份
file://buf第2、3字节为天,4、5字节为年,提取方法同上
……
::strcpy(buf,m_sPositionY);
str.Format("%c%c",buf[0],buf[1]);
PositionValue=atoi(str);
str.Format("%c%c%c%c%c%c%c",buf[2],buf[3],buf[4],buf[5],buf[6],buf[7],buf[8]);
GPSParam[m_nNumber].m_dPositionY=PositionValue*60+atof(str); file://提取出纬度
……
::strcpy(buf,m_sPositionX);
if(m_sPositionX.GetLength()==10) file://经度超过90度(如东经125度)
{
str.Format("%c%c%c",buf[0],buf[1],buf[2]);
PositionValue=atoi(str);
str.Format("%c%c%c%c%c%c%c",buf[3],buf[4],buf[5],buf[6],buf[7],buf[8],buf[9]);
GPSParam[m_nNumber].m_dPositionX=PositionValue*60+atof(str); file://提取出经度(单位为分)
}
if(m_sPositionX.GetLength()==9) file://经度未超过90度(如东经89度)
{
file://处理方法同上,只是buf的第0、1字节为度数,2~9为分数。
}
到此为止,已将时间和经纬度信息提取到GPS结构数组GPSParam中的各个变量中去,后续的处理和高层决策可根据该结构中存储的数据作出相应的处理。
小结
本文结合主要的相关程序代码对GPS全球定位系统的定位导航信息的接收和参数数据的提取进行了讨论,同时也对串口的程序设计作了简要的讲述。通过本文的设计方法可以将GPS定位导航信息从GPS接收机完整接收,通过对定位参数的提取可将其应用于其他高层应用决策如各种GIS、RS系统等。本文程序在Windows 98下,由Microsoft Visual C++ 6.0编译通过。
本篇文章来源于 GIS空间站 转载请以链接形式注明出处 网址:http://www.gissky.net/Article/45.htm
相关推荐
手把手教你用DCA1000和mmWave Studio 2.0采集AWR1843雷达数据(附驱动安装与常见报错排查)
本文详细介绍了使用DCA1000和mmWave Studio 2.0采集AWR1843毫米波雷达数据的全流程指南,包括硬件连接、驱动安装、软件配置及常见报错排查。通过实战经验分享,帮助开发者快速掌握数据采集技巧,优化雷达参数配置,提升数据质量与采集效率。
GPS单点定位原理与C++程序实现(一)
作为一名大二导航工程专业的学生,假期留校和老师做科研。众所周知,导航的目标是一下三个:P(positioning)V(velocity)T(timing)。其中,定位和测速有着不可分割的关系。下面就先来看看GPS定位的基本原理和程序实现。 一、单点定位原理 1.原始数据 目前,绝大多数的导航原始文件都来源于IERS(国际地球自转服务)所提供的数据。大家可以随便找一个能够下载卫星星历的网站,下载卫星...
单细胞轨迹分析实战:基于Monocle和CytoTRACE的细胞分化潜能与状态解析
本文提供了基于Monocle和CytoTRACE的单细胞轨迹分析实战指南。通过乳腺癌数据集,详细演示了从数据准备、伪时序分析、细胞分化潜能评估到分支点功能挖掘的全流程。结合两种工具的优势,能有效解析细胞状态动态演变,为发育和疾病研究提供关键见解。
GPS定位信息的接收
定位信息的接收 通常GPS定位信息接收系统主要由GPS接收天线、变频器、信号通道、微处理器、存储器以及电源等部分组成。由于GPS定位信息内容较少,因此多用RS-232串口将定位信息(NEMA0183语句)从GPS接收机传送到计算机中进行信息提取处理。从串口读取数据有多种方法,在此直接使用 Win32 API函数对其进行编程处理。在Windows下不允许直接对硬件端口进行控制操作,所有的端口均被
PE启动盘结合360杀毒离线版:深度清除顽固病毒实战指南
在系统安全维护领域,离线查杀是一种在独立于宿主操作系统的环境下进行病毒扫描和清除的核心技术。其原理是通过一个预启动环境(如PE)加载杀毒软件,从而绕过可能已被感染或受保护的系统核心,直接访问和扫描磁盘文件。这项技术的核心价值在于能够彻底处理那些在正常系统运行时难以清除的深度隐藏病毒、Rootkit和驱动级木马。典型的应用场景包括应对勒索软件、顽固感染型病毒以及系统启动项被劫持等情况。本文以“PE启动盘”和“360杀毒离线版”这一经典组合为例,详细解析了从工具选型、环境部署到深度查杀策略的全流程,为系统维护人
FANUC机器人PROFINET通讯方式组态
6 然后对模块进行命名及更改IP地址,点击“Network Detection”,进行扫描,会生成下图,双击商科模块会生成下边的对话框,对模块进行命名及更改IP地址,在“Permanent Name”处点对勾,完成后点击“Apply Name及Apply”进行命名。此处注意,上图左上在线在不了,网络扫描处上面也灰色的,扫描不了。5双击abcc-prt-2-port RT(FW1.13),生成下面图标,在右边点击1、2把原来内容删掉,从新在左侧加载 ,使1、2是输出,3、4为输入,完成后点击OK。
串口通讯摘要(转)
串口通信之并发与单步 物理连接示意图如下所示,每个串口挂接多个采集器。 通信协议: 包头(1B) + 地址码(1B) + 命令字(1B) + 数据长度(1B) + 校验码1(1B) + 数据正文(nB) + 校验码2(1B)。 其中,校验码1校验地址码、命令字、数据长度,校验码2校验数据正文。 1. 并发通信,性能能高。下发命令顺序与返回数据的顺序可能不一致,要保
【OpenClaw从入门到精通】第05篇:实战!OpenClaw自动化搞定邮件/日历/文件管理(2026实测避坑版)
本文聚焦OpenClaw核心实用场景,手把手教你实现邮件、日历、文件管理的全自动化。通过安装三大核心技能,配置IMAP/SMTP邮箱、跨平台日历及文件沙盒权限,结合4个虚拟实战案例,演示从邮件自动摘要、会议冲突预警到下载文件夹分类的完整流程。文中包含2026实测的命令代码、配置步骤、排障方案,所有案例需在测试环境验证,代码未上传GitHub。兼顾新手入门与进阶需求,让OpenClaw从“能聊天”升级为“能干活”,帮你节省80%重复工作时间。
(转)VC++实现GPS全球定位系统定位数据的提取
提取定位数据 GPS接收机只要处于工作状态就会源源不断地把接收并计算出的GPS导航定位信息通过串口传送到计算机中。前面的代码只负责从串口接收数据并将其放置于缓存,在没有进一步处理之前缓存中是一长串字节流,这些信息在没有经过分类提取之前是无法加以利用的。因此,必须通过程序将各个字段的信息从缓存字节流中提取出来,将其转化成有实际意义的,可供高层决策使用的定位信息数据。同其他通讯协议类似,对GPS进
【地图模块算法】二维全局地图的开源方案及对比--gmapping、hector、karto、cartographer
系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、gmapping算法建图【基于Raoo-Blackwellized粒子滤波(RBPF)算法】1.gmapping理论(1)gmapping的工作原理(2)gmapping的算法流程(3)gmapping论文理论2.gmappingROS工程框架解析(1)gmapping的功能包架构(2)gmapping订阅和发布的话题(3)gmapping算法建图参数(4)gmapping源码
AMBA-CHI协议详解(二)
读事务,写事务,原子事务,Stash事务,Dataless事务,DVM事务,Retry事务。
VC++实现GPS全球定位系统定位数据的提取(转)
引言 卫星导航技术的飞速发展已逐渐取代了无线电导航、天文导航等传统导航技术,而成为一种普遍采用的导航定位技术,并在精度、实时性、全天候等方面取得了长足进步。现不仅应用于物理勘探、电离层测量和航天器导航等诸多民用领域,在军事领域更是取得了广泛的应用--在弹道导弹、野战指挥系统、精确弹道测量以及军用地图快速测绘等领域均大量采用了卫星导航定位技术。有鉴于卫星导航技术在民用和军事领域的重要意义,使其得...
【ArcGIS风暴】Win10操作系统ArcGIS许可License无法启动的解决方法汇总(绝对成功!)
文章目录1. 关闭Windows Defender2. 关闭系统防火墙3. 删除迈克菲(McAfee)杀毒软件4. 在系统服务中启动 在安装ArcGIS软件时,最重要的一步是许可服务的正常启动,通常,由于各种各样的原因,ArcGIS许可管理器License Manager十有八九会无法启动,点N多次都没反应,如果许可服务不能如愿启动的话,即使Desktop安装成功,也是无法打开的。本文汇总了Win10操作系统之上ArcGIS安装过程中可能会导致服务无法启动的原因及解决办法。 ArcGIS安装参考教程:
VC++实现GPS全球定位系统定位数据的提取
摘要: 本文提出了一种在VC下实现对GPS全球定位系统定位信息的接收以及对各定位参数数据的提取方法。 引言 卫星导航技术的飞速发展已逐渐取代了无线电导航、天文导航等传统导航技术,而成为一种普遍采用的导航定位技术,并在精度、实时性、全天候等方面取得了长足进步。现不仅应用于物理勘探、电离层测量和航天器导航等诸多民用领域,在军事领域更是取得了广泛的应用--在弹道导弹、野战指挥系统、精确弹道测量以及军
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
WINCC7.3破解文件
WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!
VC++实现串口通信下GP接收机定位数据的提取
VC++实现GPS全球定位系统定位数据的提取
文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况
主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。
GPS 介绍
随着科学的发展GPS已经不是一个陌生的名词了,GPS在海湾战争中大显身手并给人以深刻的印象,但是有谁能了解GPS的真正含义呢? GPS 是有美国国防部( U.S. Department of Defense --DOD)开发的一套基于卫星的无线导航系统。 无论是陆地、海洋还是太空用户都可以通过GPS系统全天侯、一天24小时、全球任何位置的精确定位他们的三维坐标、速度和时间,其定位精度比
NTscan扫描工具
ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。
android通过串口获取GPS,利用C#通过串口提取GPS定位信息
摘 要: GPS定位信号的提取可以用VB,VC实现,但实际应用时会比较难用。利用C#语言提供的SerialPort类非常简单地实现了GPS定位信号的提取。关键词: GPS定位信号;C#;SerialPort全球定位系统(GPS)是一种基于空间卫星导航系统,可在地球上和地球附近提供全天候的位置和时间信息的服务。GPS系统具有高效率、多功能、高精度、操作简便、应用广泛等特点。因此,GPS不仅诸多民用领...
VC++提取GPS全球定位系统定位数据
引言 卫星导航技术的飞速发展已逐渐取代了无线电导航、天文导航等传统导航技术,而成为一种普遍采用的导航定位技术,并在精度、实时性、全天候等方面取得了长足进步。现不仅应用于物理勘探、电离层测量和航天器导航等诸多民用领域,在军事领域更是取得了广泛的应用--在弹道导弹、野战指挥系统、精确弹道测量以及军用地图快速测绘等领域均大量采用了卫星导航定位技术。有鉴于卫星导航技术在民用和军事领域的重要意义,使其
VC++实现GPS全球定位系统定位数据的提取(转载)
摘要: 本文提出了一种在VC下实现对GPS全球定位系统定位信息的接收以及对各定位参数数据的提取方法。 引言 卫星导航技术的飞速发展已逐渐取代了无线电导航、天文导航等传统导航技术,而成为一种普遍采用的导航定位技术,并在精度、实时性、全天候等方面取得了长足进步。现不仅应用于物理勘探、电离层测量和航天器导航等诸多民用领域,在军事领域更是取得了广泛的应用--在弹道导弹、野战指挥系统、精确弹道测
【20090401-02】VC++实现GPS全球定位系统定位数据的提取
定位信息的接收 通常GPS定位信息接收系统主要由GPS接收天线、变频器、信号通道、微处理器、存储器以及电源等部分组成。由于GPS定位信息内容较少,因此多用RS-232串口将定位信息(NEMA0183语句)从GPS接收机传送到计算机中进行信息提取处理。从串口读取数据有多种方法,在此直接使用 Win32 API函数对其进行编程处理。在Windows下不允许直接对硬件端口进行控制操作,所有的...
332



被折叠的 条评论
为什么被折叠?



