C#编写gps定位信息的接收

上传人:小** 文档编号:75800125 上传时间:2022-04-16 格式:DOC 页数:9 大小:103KB
收藏 版权申诉 举报 下载
C#编写gps定位信息的接收_第1页
第1页 / 共9页
C#编写gps定位信息的接收_第2页
第2页 / 共9页
C#编写gps定位信息的接收_第3页
第3页 / 共9页
资源描述:

《C#编写gps定位信息的接收》由会员分享,可在线阅读,更多相关《C#编写gps定位信息的接收(9页珍藏版)》请在装配图网上搜索。

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

2、XISTING,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=M

3、AXDWORD;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;Se

4、tCommState(m_hCom,&dcb);在成功打开并设置通讯口后,可采取轮询串口和事件触发两种方式对数据进行接收处理,本文在此采取效率比较高的事件触发方式进行接收处理,通过等待EV_RXCHA事件的发生来启动ReadFile函数完成对GPS定位信息的接收:while(true)WaitCommEvent(m_hCom,&dwEvtMask,NULL);if(dwEvtMask&EV_RXCHAR=EV_RXCHAR)if(ComStat.cbInQue0)ReadFile(m_hCom,m_readbuf,ComStat.cbInQue,&nLength,&olRead);提取定位数据

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

6、GPGSA、$GPGSV以及$GPRMC等。这些帧头标识了后续帧内数据的组成结构,各帧均以回车符和换行符作为帧尾标识一帧的结束。对于通常的情况,我们所关心的定位数据如经纬度、速度、时间等均可以从$GPRMC帧中获取得到,该帧的结构及各字段释义如下:$GPRMC,*hh当前位置的格林尼治时间,格式为hhmmss状态,A为有效位置,V为非有效接收警告,即当前天线视野上方的卫星个数少于3颗。纬度,格式为ddmm.mmmm标明南北半球,N为北半球、S为南半球径度,格式为dddmm.mmmm标明东西半球,E为东半球、W为西半球地面上的速度,范围为0.0到999.9方位角,范围为000.0到359.9度日

7、期,格式为ddmmyy地磁变化,从000.0到180.0度地磁变化方向,为E或W至于其他几种帧格式,除了特殊用途外,平时并不常用,虽然接收机也在源源不断地向主机发送各种数据帧,但在处理时一般先通过对帧头的判断而只对$GPRMG帧进行数据的提取处理。如果情况特殊,需要从其他帧获取数据,处理方法与之也是完全类似的。由于帧内各数据段由逗号分割,因此在处理缓存数据时一般是通过搜寻ASCII码$来判断是否是帧头,在对帧头的类别进行识别后再通过对所经历逗号个数的计数来判断出当前正在处理的是哪一种定位导航参数,并作出相应的处理。下面就是对缓存Data中的数据进行解帧处理的主要代码,本文在此只关心时间(日期和

8、时间)和地理坐标(经、纬度):for(inti=0;iDATALENGTH;I+)if(Datai=$)file:/帧头,SectionID为逗号计数器SectionID=0;if(Datai=10)file:/帧尾if(Datai=,)file:/逗号计数SectionID+;elseswitch(SectionID)case1:file:/提取出时间m_sTime+=Datai;break;case2:file:/判断数据是否可信(当GPS天线能接收到有3颗GPS卫星时为A,可信)if(Datai=A)GPSParamm_nNumber.m_bValid=true;break;case3:

9、file:/提取出纬度m_sPositionY+=Datai;break;case5:file:/提取出经度m_sPositionX+=Datai;break;case9:file:/提取出日期m_sDate+=Datai;break;default:break;现在已将所需信息提取到内存,即时间、日期以及经纬度分别保存在CString型变量m_sTime、m_Data、m_sPositionY和m_sPositionX中。在实际应用中往往要根据需要对其做进一步的运算处理,比如从GPS接收机中获得的时间信息为格林尼治时间,因此需要在获取时间上加8小时才为我国标准时间。而且GPS使用的WGS84

10、坐标系也与我国采用的坐标系不同,有时也要对此加以变换。而这些变换运算必须通过数值运算完成,因此需要将前面获取的字符型变量转化为数值型变量,这部分工作可放在检测到帧尾完成::strcpy(buf,m_sTime);str.Format(%c%c,buf0,buf1);GPSParamm_nNumber.m_nHour=(atoi(str)+8)%24;file:/提取出小时并转化为24小时制北京时间file:/buf第2、3字节为分钟,4、5字节为秒,提取方法同上:strcpy(buf,m_sDate);str.Format(%c%c,buf0,buf1);file:/提取出月份file:/bu

11、f第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,buf8)GPSParamm_nNumber.m_dPositionY=PositionValue*60+atof(str);file:/提取出纬度一一:strcpy(buf,m_sPositionX);if(m_sPositionX.GetLength()=10)file:/经度超过

12、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.m_dPositionX=PositionValue*60+atof(str);file:/提取出经度(单位为分)-if(m_sPositionX.GetLength()=9)file:/经度未超过90度(如东经89度)file:/处理方法同上,只是buf的第0、1字节为度数,29为分数。到此为止,

13、已将时间和经纬度信息提取到GPS结构数组GPSParan中的各个变量中去,后续的处理和高层决策可根据该结构中存储的数据作出相应的处理。摘要本文介绍了一个基于Java的GPS接收机解析器。这个Java类通过解析标准GPS接收机的输出信号,能够为导航与控制系统提供GPS时钟、经度、纬度、高程等一系列信息。本类库使用标准Java语言编写,不需要任何第三方通讯类库(包括Sun公司的Java通讯API)的支持,稍加修改即可被广泛应用在各种便携式设备和嵌入式系统中。介绍全球定位系统(GlobalPositionSystem,简称GPS)是由美国研制的导航、授时和定位系统。该系统包括空中卫星、地面跟踪监测站

14、、地面卫星数据注入站、地面数据处理中心和数据通讯网络等部分。这个系统通过24颗地球同步卫星全天候向地面发送授时和定位信号,其中高精度的信号仅供美国军方和北约盟军使用,普通用户只能够接收和解析低经度的民用信号。如果对接收到的民用信号进行差分处理,也可以得到精度很高的定位数据。目前一般的差分GPS接收机都可以得到1米精度的定位数据,在欧美市场上已经出现了厘米级的差分GPS接收机。普通用户只需购买GPS接收机,就可享受免费的导航、授时和定位服务。目前全球定位系统技术在农业、林业、水利、交通、航空、测绘、安全防范、军事、电力、通讯、城市管理等领域都有广泛应用。在上述所述应用领域中,GPS接收机通常是某

15、些便携式设备或者是嵌入式系统的外接输入设备。一般的GPS接收机均通过串行通讯口主动向主机发送数据,其通讯参数为4800(波特率),8(数据位),1(停止位),0(奇偶校验位)。由于Java语言的平台无关性,很多基于便携式设备和嵌入式系统的应用程序都米用Java语言进行开发。因此,一个基于标准Java语言的GPS接收机解析器,无疑具有广泛的应用前景。本文所介绍的基于Java的GPS接收机解析器从标准GPS接收机的GGA输出信息中解析标准时钟(UniversalTimeCoordinate,UTC、纬度(Latitude)、经度(Longitude)和高程(Altitude)等基本授时和定位信息。

16、根据美国海军电子设备标准接口规定,该信息包含标准时间、经纬度、高程等数据,每个数据之间用逗号分隔,以一个回车符号结束,一般格式如下:$-GGA标准时间,纬度,南北,经度,东西,信号质量,卫星总数,水平精度,高程,米,地理间隔,米,差分数据龄期,差分基准站ID*hh$-GGAGGA信息标示符,根据接收机的不同,该标示符中的第二和第三个字节会有所不同。标准时间一一个浮点数,数据格式hhmmss.ss纬度一数据格式ddmm.mm其中dd为度(整数,0到90);mm.m为分(浮点数,0到60)。南北一南北半球标示符号,一个字节,S为南半球,N为北半球。经度一数据格式dddmm.mm其中ddd为度(整数

17、,0到180);mm.mn为分(浮点数,0到60)。东西一东西半球标示符号,一个字节,E为东半球,W为西半球。信号质量一一个整数,从0到&卫星总数一一个整数,从0到24。水平精度一一个浮点数。高程一该地点在平均海平面以上的高程,一个浮点数。米一长度单位标示符,一个字节,M地理间隔一WGS-84地球椭球表面与平均海平面表面之间的距离,一个浮点数。米一长度单位标示符,一个字节,M差分数据龄期一上一次SC-104标定到当前的总秒数,一个浮点数。查分基准站ID一个整数,从0000到1023。除了GGA信息以外,一般的GPS接收机还会输出其他类型的信息,例如AAM信息,ACK信息,GNS信息等等。本文所

18、介绍的Java类库持续的监听GPS接收机所在的串行通讯口,从其输出信息中截获GGA信息并进行解析,从而获得当前的时间和定位信息。本类库包括三个Java模块以及一组测试数据:GPS数据模块一实时保存当前数据(GpsInfo.java)。GPS接收机模块一供外部程序调用(GpsReceiver.java)。数据接收与解析模块一接收与解析GPS信息(GpsParser.java)。测试模块一功能测试与范例(TestGps.java)。测试数据一一组实际GPS测量数据(gps.dat)。GPS数据模块GPS数据模块用来保存经过解析的授时与定位数据,同时提供访问与更新这些数据的方法。数据接收与解析模块通

19、过数据更新方法SetXyz()实时更新授时与定位数据,用户应用程序通过数据访问方法GetXyz()使用授时与定位数据。考虑到可能存在多个应用程序(线程)同时对GPS数据进行修改的情况,所有的数据更新方法都利用synchronized关键字和notifyAII()方法实现了数据同步。在这个类中包含的数据访问与更新方法比较多,部分列举如下:数据访问方法:publicfloatGetTime()此方法返回当前标准时间,其返回值是一个浮点数,数据格式hhmmss.ssopublicfloatGetLatitude()此方法返回当前纬度信息,数据格式ddmm.mm其中dd为度(整数,0到90);mm.m

20、为分(浮点数,0到60)。publicStringGetNS()此方法返回南北半球标示符号,一个字节,S为南半球,N为北半球。publicfloatGetLongitude()此方法返回当前经度信息,数据格式dddmm.mp其中ddd为度(整数,0到180);mm.m为分(浮点数,0到60)。publicStringGetEW()此方法返回东西半球标示符号,一个字节,E为东半球,W为西半球。publicfloatGetAltitude()此方法返回当前平均海平面以上高程,一个浮点数。数据更新方法:publicvoidSetTime(floattime)此方法更新当前标准时间,输入参数是一个浮点

21、数,数据格式hhmmss.ssopublicvoidSetLatitude(floatlatitude)此方法更新当前纬度信息,参数格式ddmm.mm其中dd为度(整数,0到90);mm.mr为分(浮点数,0到60)。publicvoidSetNS(Stringns)此方法更新南北半球标示符号,一个字节,S为南半球,N为北半球。publicvoidSetLongitude(floatIongitude)此方法更新当前经度信息,参数格式dddmm.mm其中ddd为度(整数,0到180);mm.mr为分(浮点数,0到60)。publicvoidSetEW(Stringew)此方法更新东西半球标示符

22、号,一个字节,E为东半球,W为西半球。publicvoidSetAltitude(floataltitude)此方法更新当前平均海平面以上高程,输入参数是一个浮点数。GPS接收机模块GPS接收接模块是本类库于其他应用程序的接口,本模块为其他应用程序提供了连接、启动、切断GPS接收机以及实时查询GPS数据的方法。具体介绍如下:构造方法:publicGpsReceiver(StringGpsDevice,intFactor)publicGpsReceiver(StringGpsDevice,intFactor,booleanRecord)其中:GpsDevice即将使用的GPS设备名称。如果GPS

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

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

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

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

27、来记录GPS接收机的输出数据。这些数据可以在程序测试中模拟GPS接收机的输入。Info用来保存授时与定位信息的GPS数据对象。数据接收与解析模块的核心部分是一个线程,该线程被设计成一个内置类,这样的设计是的外部程序能够通过该类自定义的start()和stop()方法来启动和终止该线程。在start()方法中将一个名为DevOn的逻辑变量设置为真并且启动数据接收与解析线程,在stop()方法中则将DevOn设置为假。数据接收与解析线程在运行过程中不断监测DevOn的值,如果DevOn为假,则终止自身的执行。这个设计避免了已经不鼓励使用的(deprecated)的stop()方法来强制终止线程的执

28、行,从而保证了该线程的安全终止。在数据接收与解析模块中把GPS输入设备统一当作文件进行处理,因为大多数的操作系统均将串行端口设置为系统保留文件,应用程序只需要对该文件进行读写即可以通过串行端口与外界设备进行通讯。一个GPS接收机解析器只需要从串行端口实时读取数据而并不需要向GPS接收机发送控制指令,使用标准文件输入函数来读取GPS接收机的输入信号,完全能够满足功能上的要求。这样的设计使得数据接收与解析模块在实时模式和模拟模式下都能够使用同样的数据接收与解析程序,大大的简化了整个程序的结构。此外,利用标准文件输入函数来对GPS接收机进行操作,避免了在类库中使用例如m等第三方通讯API,大大的提高

29、了本类库的可移植性。由于GPS接收机的每一条信息均以回车换行符号结束,在数据接收与解析模块中使用了BufferedReader来读取GPS接收机的输入信息。GPS接收机的所有输入信号,首先被系统存放在一个缓冲区里面。数据接收与解析模块利用readLine()方法每次从该缓冲区里面读取一行数据,如果该行数据包含GGA数据标示符,则利用该数据解析授时与定位信息,反之则将该行数据舍弃继续读取下一行数据进行判断和处理。由于普通GPS接收机的数据更新频率为1秒,在模拟模式下,数据接收与解析模块每读取到一条GGA数据就暂停1秒钟,从而模拟GPS接收机的输入。如果用户指定了一个大于1的加速系数,则根据加速系

30、数计算暂停的时间,例如在加速系数为5的情况下暂停时间为200毫秒,因此回放模拟的速度相当于实际速度的5倍。这个功能在耗时较长的程序测试中非常有用。考虑到一般应用程序所能够获得的时钟信号的精度不是很高的缘故,我们不推荐使用大于50的加速系数。此外,数据接收与解析模块还提供了数据记录功能。利用数据记录功能能够将实测到GPS信号保存到一个数据文件里面供回放和测试使用。该功能自动产生一个扩展名为.gps的数据文件,主文件名根据当时的系统时间自动生成,在通常的情况下不会发生数据覆盖的问题。程序测试在本类库中提供了一个测试程序和一组测试数据。利用这个程序和数据用户可以使用实时和模拟两种方式对本类库进行测试

31、,也可以在这个测试程序的基础上开发自己的应用程序。测试环境包括多种版本的Windows95/98/2000操作系统,四个不同型号的差分GPS接收机,两个常规Java虚拟机以及两个嵌入式Java虚拟机。测试结果表明,本类库在以上不同条件的各种组合下均能够利用实时和模拟两种模式正常工作。结论本文设计和实现了一个基于Java的GPS接收机解析器,全面测试结果表明,这个GPS接收机解析器能够实现如下功能:(1) 在实时模式下,从GPS接收机接收与解析授时与定位数据。(2) 在模拟模式下,利用GPS数据文件回放授时与定位数据。用户可以通过设定一个加速系数来改变数据回访的速度。(3) 能够将实测到GPS信号保存到一个数据文件里面供回放和测试使用。(4) 本类库不需要任何第三方通讯类库(包括Sun公司的Java通讯API)的支持,稍加修改即可被广泛应用在各种便携式设备和嵌入式系统中。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!