ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:22.87KB ,
资源ID:30100128      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30100128.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(c编写gps定位信息的接收.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

c编写gps定位信息的接收.docx

1、c编写gps定位信息的接收定位信息的接收通常GPS定位信息接收系统主要由GPS接收天线、变频器、信号通道、微处理器、存储器以及电源等部分组成。由于GPS定位信息内容较少,因此多用RS-232串口将定位信息(NEMA0183语句)从GPS接收机传送到计算机中进行信息提取处理。从串口读取数据有多种方法,在此直接使用 Win32 API函数对其进行编程处理。在Windows下不允许直接对硬件端口进行控制操作,所有的端口均被视为文件,因此在对串口进行侦听之前需要通过打开文件来打开串口,并对其进行相关参数配置: m_hCom=CreateFile(COM1,GENERIC_READ|GENERIC_WR

2、ITE,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进行设置 Comm

3、TimeOuts.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.

4、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.cbInQue0) ReadFile(

5、m_hCom,m_readbuf,ComStat.cbInQue,&nLength,&olRead); 提取定位数据 GPS接收机只要处于工作状态就会源源不断地把接收并计算出的GPS导航定位信息通过串口传送到计算机中。前面的代码只负责从串口接收数据并将其放置于缓存,在没有进一步处理之前缓存中是一长串字节流,这些信息在没有经过分类提取之前是无法加以利用的。因此,必须通过程序将各个字段的信息从缓存字节流中提取出来,将其转化成有实际意义的,可供高层决策使用的定位信息数据。同其他通讯协议类似,对GPS进行信息提取必须首先明确其帧结构,然后才能根据其结构完成对各定位信息的提取。对于本文所使用的GARMI

6、N GPS天线板,其发送到计算机的数据主要由帧头、帧尾和帧内数据组成,根据数据帧的不同,帧头也不相同,主要有$GPGGA、$GPGSA、$GPGSV以及$GPRMC等。这些帧头标识了后续帧内数据的组成结构,各帧均以回车符和换行符作为帧尾标识一帧的结束。对于通常的情况,我们所关心的定位数据如经纬度、速度、时间等均可以从$GPRMC帧中获取得到,该帧的结构及各字段释义如下: $GPRMC,*hh 当前位置的格林尼治时间,格式为hhmmss 状态, A 为有效位置, V为非有效接收警告,即当前天线视野上方的卫星个数少于3颗。 纬度, 格式为ddmm.mmmm 标明南北半球, N 为北半球、S为南半球

7、 径度,格式为dddmm.mmmm 标明东西半球,E为东半球、W为西半球 地面上的速度,范围为0.0到999.9 方位角,范围为000.0到 359.9 度 日期, 格式为ddmmyy 地磁变化,从000.0到 180.0 度 地磁变化方向,为E 或 W 至于其他几种帧格式,除了特殊用途外,平时并不常用,虽然接收机也在源源不断地向主机发送各种数据帧,但在处理时一般先通过对帧头的判断而只对$GPRMC帧进行数据的提取处理。如果情况特殊,需要从其他帧获取数据,处理方法与之也是完全类似的。由于帧内各数据段由逗号分割,因此在处理缓存数据时一般是通过搜寻ASCII码$来判断是否是帧头,在对帧头的类别进行

8、识别后再通过对所经历逗号个数的计数来判断出当前正在处理的是哪一种定位导航参数,并作出相应的处理。下面就是对缓存Data中的数据进行解帧处理的主要代码,本文在此只关心时间(日期和时间)和地理坐标(经、纬度): for(int i=0;iDATALENGTH;I+) if(Datai=$) file:/帧头,SectionID为逗号计数器 SectionID=0; if(Datai=10) file:/帧尾 if(Datai=,) file:/逗号计数 SectionID+; else switch(SectionID) case 1: file:/提取出时间 m_sTime+=Datai; br

9、eak; case 2: file:/判断数据是否可信(当GPS天线能接收到有3颗GPS卫星时为A,可信) if(Datai=A) GPSParamm_nNumber.m_bValid=true; break; case 3: file:/提取出纬度 m_sPositionY+=Datai; break; case 5: file:/提取出经度 m_sPositionX+=Datai; break; case 9: file:/提取出日期 m_sDate+=Datai; break; default: break; 现在已将所需信息提取到内存,即时间、日期以及经纬度分别保存在CString型变

10、量 m_sTime、m_Data、m_sPositionY和m_sPositionX中。在实际应用中往往要根据需要对其做进一步的运算处理,比如从GPS接收机中获得的时间信息为格林尼治时间,因此需要在获取时间上加8小时才为我国标准时间。而且GPS使用的WGS84坐标系也与我国采用的坐标系不同,有时也要对此加以变换。而这些变换运算必须通过数值运算完成,因此需要将前面获取的字符型变量转化为数值型变量,这部分工作可放在检测到帧尾完成: :strcpy(buf,m_sTime); str.Format(%c%c,buf0,buf1); GPSParamm_nNumber.m_nHour=(atoi(st

11、r)+8)%24; file:/提取出小时并转化为24小时制北京时间 file:/buf第2、3字节为分钟,4、5字节为秒,提取方法同上 :strcpy(buf,m_sDate); str.Format(%c%c,buf0,buf1); file:/提取出月份 file:/buf第2、3字节为天,4、5字节为年,提取方法同上 :strcpy(buf,m_sPositionY); str.Format(%c%c,buf0,buf1); PositionValue=atoi(str); str.Format(%c%c%c%c%c%c%c,buf2,buf3,buf4,buf5,buf6,buf7,

12、buf8); GPSParamm_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,buf0,buf1,buf2); PositionValue=atoi(str); str.Format(%c%c%c%c%c%c%c,buf3,buf4,buf5,buf6,buf7,buf8,buf9); GPSParamm_nNumber

13、.m_dPositionX=PositionValue*60+atof(str); file:/提取出经度(单位为分) if(m_sPositionX.GetLength()=9) file:/经度未超过90度(如东经89度) file:/处理方法同上,只是buf的第0、1字节为度数,29为分数。 到此为止,已将时间和经纬度信息提取到GPS结构数组GPSParam中的各个变量中去,后续的处理和高层决策可根据该结构中存储的数据作出相应的处理。 摘要本文介绍了一个基于Java的GPS 接收机解析器。这个Java类通过解析标准GPS接收机的输出信号,能够为导航与控制系统提供GPS 时钟、经度、纬度、

14、高程等一系列信息。本类库使用标准Java语言编写,不需要任何第三方通讯类库(包括Sun 公司的Java通讯API )的支持,稍加修改即可被广泛应用在各种便携式设备和嵌入式系统中。介绍全球定位系统 (Global Position System,简称GPS )是由美国研制的导航、授时和定位系统。该系统包括空中卫星、地面跟踪监测站、地面卫星数据注入站、地面数据处理中心和数据通讯网络等部分。这个系统通过 24颗地球同步卫星全天候向地面发送授时和定位信号,其中高精度的信号仅供美国军方和北约盟军使用,普通用户只能够接收和解析低经度的民用信号。如果对接 收到的民用信号进行差分处理,也可以得到精度很高的定位

15、数据。目前一般的差分GPS 接收机都可以得到1 米精度的定位数据,在欧美市场上已经出现了厘米级的差分GPS 接收机。普通用户只需购买GPS 接收机,就可享受免费的导航、授时和定位服务。目前全球定位系统技术在农业、林业、水利、交通、航空、测绘、安全防范、军事、电力、通讯、城市管理等领域 都有广泛应用。在上述所述应用领域中,GPS 接收机通常是某些便携式设备或者是嵌入式系统的外接输入设备。一般的GPS 接收机均通过串行通讯口主动向主机发送数据,其通讯参数为4800(波特率),8(数据位),1(停止位),0(奇偶校验位)。 由于 Java语言的平台无关性,很多基于便携式设备和嵌入式系统的应用程序都采

16、用Java 语言进行开发。因此,一个基于标准Java语言的GPS 接收机解析器,无疑具有广泛的应用前景。本文所介绍的基于Java的GPS 接收机解析器从标准GPS 接收机的GGA 输出信息中解析标准时钟(Universal Time Coordinate, UTC)、纬度(Latitude)、经度(Longitude )和高程(Altitude)等基本授时和定位信息。根据美国海军电子设备标准接口规定,该信息包含标准时间、经纬度、高程等数据,每个数据之间用逗号分 隔,以一个回车符号结束,一般格式如下:$GGA,标准时间,纬度,南北,经度,东西,信号质量,卫星总数,水平精度,高程,米,地理间隔,米

17、,差分数据龄期,差分基准站ID*hh$GGA GGA 信息标示符,根据接收机的不同,该标示符中的第二和 第三个字节会有所不同。标准时间 一个浮点数,数据格式hhmmss.ss。纬度 数据格式ddmm.mm,其中dd为度(整数,0 到90);mm.mm为 分(浮点数,0 到60)。南北 南北半球标示符号,一个字节,S 为南半球,N 为北半球。经度 数据格式dddmm.mm,其中ddd为度(整数,0到180);mm.mm 为分(浮点数,0 到60)。东西 东西半球标示符号,一个字节,E 为东半球,W 为西半球。信号质量 一个整数,从0 到8。卫星总数 一个整数,从0 到24。水平精度 一个浮点数。

18、高程 该地点在平均海平面以上的高程,一个浮点数。米 长度单位标示符,一个字节,M。地理间隔 WGS-84地球椭球表面与平均海平面表面之间的距离,一个浮 点数。米 长度单位标示符,一个字节,M。差分数据龄期 上一次SC-104标定到当前的总秒数,一个浮点数。查分基准站ID 一个整数,从0000到1023。除 了GGA 信息以外,一般的GPS 接收机还会输出其他类型的信息,例如AAM 信息,ACK 信息,GNS 信息等等。本文所介绍的Java类库持续的监听GPS 接收机所在的串行通讯口,从其输出信息中截获GGA 信息并进行解析,从而获得当前的时间和定位信息。本类库包括三个Java模块以及一组测试数

19、据:GPS 数据模块 实时保存当前数据(GpsInfo.java)。GPS 接收机模块 供外部程序调用(GpsReceiver.java)。数据接收与解析模块 接收与解析GPS 信息(GpsParser.java)。测试模块 功能测试与范例(TestGps.java)。测试数据 一组实际GPS 测量数据(gps.dat)。GPS 数据模块GPS 数据模块用来保存经过解析的授时与定位数据,同时提供访问与更新这些数据的方法。数据接收与解析模块通过数据更新方法SetXyz()实时更新授时与定位 数据,用户应用程序通过数据访问方法GetXyz()使用授时与定位数据。考虑到可能存在多个应用程序(线程)同

20、时对GPS 数据进行修改的情况,所有的数据更新方法都利用synchronized关键字和notifyAll() 方法实现了数据同步。在这个类中包含的数据访问与更新方法比较多,部分列举如下:数据访问方法:public float GetTime()此方法返回当前标准时间,其返回值是一个浮点数,数据格式hhmmss.ss。public float GetLatitude()此方法返回当前纬度信息,数据格式ddmm.mm,其中dd为度(整数,0 到90); mm.mm为分(浮点数,0 到60)。public String GetNS()此方法返回南北半球标示符号,一个字节,S 为南半球,N 为北半球

21、。public float GetLongitude()此方法返回当前经度信息,数据格式dddmm.mm,其中ddd为度(整数,0到180) ;mm.mm为分(浮点数,0 到60)。public String GetEW()此方法返回东西半球标示符号,一个字节,E 为东半球,W 为西半球。public float GetAltitude()此方法返回当前平均海平面以上高程,一个浮点数。数据更新方法:public void SetTime(float time)此方法更新当前标准时间,输入参数是一个浮点数,数据格式hhmmss.ss。public void SetLatitude(float l

22、atitude)此方法更新当前纬度信息,参数格式ddmm.mm,其中dd为度(整数,0 到90); mm.mm为分(浮点数,0 到60)。public void SetNS(String ns)此方法更新南北半球标示符号,一个字节,S 为南半球,N 为北半球。public void SetLongitude(float longitude)此方法更新当前经度信息,参数格式dddmm.mm,其中ddd为度(整数,0到180) ;mm.mm为分(浮点数,0 到60)。public void SetEW(String ew)此方法更新东西半球标示符号,一个字节,E 为东半球,W 为西半球。publi

23、c void SetAltitude(float altitude)此方法更新当前平均海平面以上高程,输入参数是一个浮点数。GPS 接收机模块 GPS 接收接模块是本类库于其他应用程序的接口,本模块为其他应用程序提供了连接、启动、切断GPS 接收机以及实时查询GPS 数据的方法。具体介绍如下:构造方法:public GpsReceiver(String GpsDevice, int Factor)public GpsReceiver(String GpsDevice, int Factor, boolean Record)其中:GpsDevice 即将使用的GPS 设备名称。如果GPS 接收机

24、与计算机的串口COM1 或者是COM2相连接,则使用”COM1或者是”COM2作为设备名称, 以此类推;如果使用GPS 数据文件代替GPS 接收机的输入,则使 用该文件名作为设备名称,例如”gps.dat”。Factor 如果使用GPS 数据文件代替GPS 接收机的输入,则可以利用此变 量制定一个加速系数,用于快速回放等功能。普通GPS 接收机每 秒钟更新一次数据,如果指定加速系数为5 ,则每秒钟回放5 秒 钟的实际测量数据。如果从GPS 接收机接收数据,则需要将该参 数设定为0 。Record 如果使用了GPS 接收机,则可以通过将该参数设定为true来记录 GPS 接收机的输出数据。这些数

25、据可以在程序测试中模拟GPS 接 收机的输入。操作方法:public void StartReceiver()此方法启动与GPS 接收机的连接,并且开始更新授时与定位数据。public void StopReceiver()此方法停止更新授时与定位数据,并且切断与GPS 接收机的连接。public GpsInfo GetGpsData()此方法返回当前的授时与定位数据。用 户在使用本类库的时候,通常是先声明一个GpsReceiver 对象,然后利用上述StartReceiver() 方法启动与GPS 接收机的连接并且开始接收与解析授时与定位信息。当用户不再需要使用来自GPS 接收机的信息时,可

26、以利用StopReceiver()方法切断与GPS 接收机的连接并且释放所占用的系统资源。数据接收与解析模块数 据接收与解析模块是本类库的核心部分,这个模块负责监听GPS 设备输出的信号,从中截获并解析GGA 信息,从而得到最新的授时与定位数据。该模块可以使用实时和模拟两种方式工作,在实时模式下使用GPS 接收机作为输入设备,在模拟模式下使用GPS 数据文件模拟GPS 接收机的输入。此外,数据接收与解析模块还能够将GPS 接收机的输出数据保存到数据文件中供程序测试等使用。因此,数据接收与解析模块的构造方法与GPS 接收机模块的构造方法是类似的。构造方法:public GpsParser(Str

27、ing GpsDevice, int Factor, boolean Record, GpsInfo Info)其中:GpsDevice 即将使用的GPS 设备名称。如果GPS 接收机与计算机的串口COM1 或者是COM2相连接,则使用”COM1或者是”COM2作为设备名称, 以此类推;如果使用GPS 数据文件代替GPS 接收机的输入,则使 用该文件名作为设备名称,例如”gps.dat”。Factor 如果使用GPS 数据文件代替GPS 接收机的输入,则可以利用此变 量制定一个加速系数,用于快速回放等功能。普通GPS 接收机每 秒钟更新一次数据,如果指定加速系数为5 ,则每秒钟回放5 秒 钟的

28、实际测量数据。如果从GPS 接收机接收数据,则需要将该参 数设定为0 。Record 如果使用了GPS 接收机,则可以通过将该参数设定为true来记录 GPS 接收机的输出数据。这些数据可以在程序测试中模拟GPS 接 收机的输入。Info 用来保存授时与定位信息的GPS 数据对象。数 据接收与解析模块的核心部分是一个线程,该线程被设计成一个内置类,这样的设计是的外部程序能够通过该类自定义的start() 和stop()方法来启动和终止该线程。在start() 方法中将一个名为DevOn 的逻辑变量设置为真并且启动数据接收与解析线程,在stop()方法中则将DevOn 设置为假。数据接收与解析线程在运行过程中不断监测DevOn 的值,如果DevOn 为假,则终止自身的执行。这个设计避免了已经不鼓励使用的(deprecated)的stop()方法来强制终止线程的执行,从而保证了该线程的安全终 止。在数据接收与解析模块中把GPS 输入设备统一当作文件进行处理,因为大多数的操作系统均将串行端口设置为系统保留文件,应用程序只需要对该文件进行读写即可以通过串行端口与外界设备进行 通讯。一个GPS 接收机解析器只需要从串行端口实时读取数据而并不需要

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1