GPS数据读取与处理
GPS数据读取与处理
GPS模块简介
SiRF芯片在2004年发布的最新的第三代芯片SiRFstar III(GSW 3.0/3.1),使得民用GPS芯片在性能方面登上了一个顶峰,灵敏度比以前的产品大为提升。这一芯片通过采用20万次/频率的相关器提高了灵敏度,冷开机/暖开机/热开机的时间分别达到42s/38s/8s,可以同时追踪20个卫星信道。是目前市场上应用最为广泛,同时性价比也非常高的一款芯片,因此在本设计中同样采用以此芯片为核心的GPS模块。
GPS模块的数据格式
对GPS模块的数据处理本质上还是串口通信程序设计,只是GPS模块的输出遵循固定的格式,通过字符串检索查找即可从模块发送的数据中找出需要的数据,常用的GPS模块大多采用NMEA-0183 协议。NMEA-0183 是美国国家海洋电子协会(National Marine Electronics Association)所指定的标准规格,这一标准制订所有航海电子仪器间的通讯标准,其中包含传输资料的格式以及传输资料的通讯协议。
以下是一组正常的GPS 数据
$GPGGA,082006.000,3852.9276,N,11527.4283,E,1,08,1.0,20.6,M,,,,0000*35
$GPRMC,082006.000,A,3852.9276,N,11527.4283,E,0.00,0.0,261009,,*38
$GPVTG,0.0,T,,M,0.00,N,0.0,K*50
下面分别对每组数据的含义进行分析。
GPS 固定数据输出语句($GPGGA),这是一帧GPS 定位的主要数据,也是使用最广的数据。为了便于理解,下面举例说明$GPGGA语句各部分的含义。
例:$GPGGA,082006.000,3852.9276,N,11527.4283,E,1,08,1.0,20.6,M,,,,0000*35
其标准格式为:
$GPGGA,(1),(2),(3),(4),(5),(6),(7),(8),(9),M,(10),M,(11),(12)*hh(CR)(LF)
各部分所对应的含义为:
(1) 定位UTC 时间:08 时20 分06 秒
(2) 纬度(格式ddmm.mmmm:即dd 度,mm.mmmm 分);
(3) N/S(北纬或南纬):北纬38 度52.9276 分;
(4) 经度(格式dddmm.mmmm:即ddd 度,mm.mmmm 分);
(5) E/W(东经或西经):东经115 度27.4283 分;
(6) 质量因子(0=没有定位,1=实时GPS,2=差分GPS):1=实时GPS;
(7) 可使用的卫星数(0~8):可使用的卫星数=08;
(8) 水平精度因子(1.0~99.9);水平精度因子=1.0;
(9) 天线高程(海平面,-9999.9~99999.9,单位:m);天线高程=20.6m);
(10) 大地椭球面相对海平面的高度(-999.9~9999.9,单位:m):无;
(11) 差分GPS 数据年龄,实时GPS 时无:无;
(12) 差分基准站号(0000~1023),实时GPS 时无:无;
*总和校验域;hh 总和校验数:35(CR)(LF)回车,换行。
GPRMC(建议使用最小GPS 数据格式)
$GPRMC,082006.000,A,3852.9276,N,11527.4283,E,0.00,0.0,261009,,*38
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11><CR><LF>
(1) 标准定位时间(UTC time)格式:时时分分秒秒.秒秒秒(hhmmss.sss)。
(2) 定位状态,A = 数据可用,V = 数据不可用。
(3) 纬度,格式:度度分分.分分分分(ddmm.mmmm)。
(4) 纬度区分,北半球(N)或南半球(S)。
(5) 经度,格式:度度分分.分分分分。
(6) 经度区分,东(E)半球或西(W)半球。
(7) 相对位移速度, 0.0 至1851.8 knots
(8) 相对位移方向,000.0 至359.9 度。实际值。
(9) 日期,格式:日日月月年年(ddmmyy)。
(10) 磁极变量,000.0 至180.0。
(11) 度数。
(12) Checksum.(检查位)
$GPVTG 地面速度信息
例:$GPVTG,0.0,T,,M,0.00,N,0.0,K*50
字段0:$GPVTG,语句ID,表明该语句为Track Made Good and Ground Speed(VTG)地
面速度信息
字段1:运动角度,000 - 359,(前导位数不足则补0)
字段2:T=真北参照系
字段3:运动角度,000 - 359,(前导位数不足则补0)
字段4:M=磁北参照系
字段5:水平运动速度(0.00)(前导位数不足则补0)
字段6:N=节,Knots
字段7:水平运动速度(0.00)(前导位数不足则补0)
字段8:K=公里/时,km/h
字段9:校验值
表 1 GPS模块主要参数
GPS模块主要参数 |
|||
GPS 芯片组 |
SiRF Star III |
工作频率 |
L1, 1575.42 MHz |
粗捕获码 |
1.023 MHz chip rate |
同时跟踪通道数 |
20 |
灵敏度 |
-159 dBm |
定位精度 |
5m(2维均方根, 允许广域差分系统) |
最小速度 |
0.1 m/s |
时间精度 |
1μS(与GPS时间同步) |
默认 坐标系 |
1984年世界大地坐标系(WGS-84) |
重获时间 |
0.1S(平均值) |
热启动 |
1S(平均值) |
温启动 |
38S(平均值) |
冷启动 |
42S(平均值) |
最高工作海拔 |
18km(60000feet) |
最大 移动速率 |
515m/S(1000knots) |
最大加速度 |
4g |
最大 急冲度 |
20m/S3 |
电源电压 |
5V±0.5V |
整机电流 |
约60mA,不超过100mA |
整板外形 |
61mm×49mm×17mm |
GPS 芯片外形 |
27.9mm×20mm×2.9mm |
波特率 |
9600bps |
数据输出格式 |
SiRF二进制格式或NMEA 0183 GGA, GSA, GSV, RMC,VTG,GLL |
数据输出电平 |
同时具备TTL电平和RS232电平 |
数据 输出接口 |
20pin插针(TTL电平)和DB9母座 |
天线类型 |
外置有源GPS天线(3.3V/5V电压可选, |
后备电池 |
CR1220锂电池,3V,不可充电 |
工作温度 |
-40ºC至+85ºC |
GPS模块的应用程序设计
GPS模块的应用程序设计主要分为两部分,第一部分为串口的设置于数据读取,第二部分为数据的分析和需要数据的提取。
与其他的关于设备编程的方法一样,在Linux下,操作、控制串口也是通过操作起设备文件进行的。在Linux下,串口的设备文件是/dev/ttyS0或/dev/ttyS1等。因此要读写串口,我们首先要打开串口,然后根据GPS模块的配置参数对串口的波特率、校验、流控制等进行设置,这些参数设置均通过对termios结构中c_cflag的配置实现,串口配置部分函数如下:

int gps::set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
struct termios newtio,oldtio;
if ( tcgetattr( fd,&oldtio) != 0)
{
perror("SetupSerial 1");
return -1;
}
bzero( &newtio, sizeof( newtio ) );
newtio.c_cflag |= CLOCAL | CREAD;
newtio.c_cflag &= ~CSIZE; switch( nBits )
{
case 7:
newtio.c_cflag |= CS7;
break;
case 8:
newtio.c_cflag |= CS8;
break;
} switch( nEvent )
{
case 'O': //奇校验
newtio.c_cflag |= PARENB;
newtio.c_cflag |= PARODD;
newtio.c_iflag |= (INPCK | ISTRIP);
break;
case 'E': //偶校验
newtio.c_iflag |= (INPCK | ISTRIP);
newtio.c_cflag |= PARENB;
newtio.c_cflag &= ~PARODD;
break;
case 'N': //无校验
newtio.c_cflag &= ~PARENB;
break;
} switch( nSpeed )
{
case 2400:
cfsetispeed(&newtio, B2400);
cfsetospeed(&newtio, B2400);
break;
case 4800:
cfsetispeed(&newtio, B4800);
cfsetospeed(&newtio, B4800);
break;
case 9600:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
case 115200:
cfsetispeed(&newtio, B115200);
cfsetospeed(&newtio, B115200);
break;
default:
cfsetispeed(&newtio, B9600);
cfsetospeed(&newtio, B9600);
break;
}
if( nStop == 1 )
{
newtio.c_cflag &= ~CSTOPB;
}
else if ( nStop == 2 )
{
newtio.c_cflag |= CSTOPB;
}
newtio.c_cc[VTIME] = 0;
newtio.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH);
if((tcsetattr(fd,TCSANOW,&newtio))!=0)
{
qDebug()<<"com set error"<<endl;
return -1;
}
qDebug()<<"set done!"<<endl;
return 0;
}

在GPS数据的处理上首先将窗口数据存入一个字符串,接着通过对字符串数据的判断来提取数据内容,判断分为两步,首先判断是什么类型的数据,在本程序的设计中需要读取$GPRMC和$GPGGA两组数据,因此首先判断字符串GPS_BUF[5]是C还是A,由于数据是通过符号“,”进行隔开,因此通过查找“,”来确定数据位置。在实现上将得到逗号位置函数单独封装调用,程序如下:

//得到指定序号的逗号位置
int gps::GetComma(int num,char *str)
{
int i,j=0;
int len=strlen(str);
for(i=0;i<len;i++)
{
if(str[i]==',')
{
j++;
} if(j==num)
return i+1;
}
return 0;
}

接下来根据数据格式,通过逗号位置,提取数据信息,程序如下:

void gps::gps_parse()
{
int tmp;
char c; c = GPS_BUF[5];
if(c=='C')
{
//"GPRMC"
GPS->D.hour =(GPS_BUF[ 7]-'0')*10+(GPS_BUF[ 8]-'0');
GPS->D.minute =(GPS_BUF[ 9]-'0')*10+(GPS_BUF[10]-'0');
GPS->D.second =(GPS_BUF[11]-'0')*10+(GPS_BUF[12]-'0');
tmp = GetComma(9,GPS_BUF);
GPS->D.day =(GPS_BUF[tmp+0]-'0')*10+(GPS_BUF[tmp+1]-'0');
GPS->D.month =(GPS_BUF[tmp+2]-'0')*10+(GPS_BUF[tmp+3]-'0');
GPS->D.year =(GPS_BUF[tmp+4]-'0')*10+(GPS_BUF[tmp+5]-'0')+2000; GPS->status = GPS_BUF[GetComma(2,GPS_BUF)];
GPS->latitude = get_locate(get_double_number(&GPS_BUF[GetComma(3,GPS_BUF)]));
GPS->NS = GPS_BUF[GetComma(4,GPS_BUF)];
GPS->longitude= get_locate(get_double_number(&GPS_BUF[GetComma(5,GPS_BUF)]));
GPS->EW = GPS_BUF[GetComma(6,GPS_BUF)];
GPS->speed = get_double_number(&GPS_BUF[GetComma(7,GPS_BUF)]);
UTC2BTC(&GPS->D); } if(c=='A')
{
//"$GPGGA"
GPS->high = get_double_number(&GPS_BUF[GetComma(9,GPS_BUF)]);
} }
//将获取文本信息转换为double型 double gps::get_double_number(char *s)
{
char buf[128];
int i;
double rev;
i=GetComma(1,s);
strncpy(buf,s,i);
buf[i]=0;
rev=atof(buf); return rev;
} double gps::get_locate(double temp)
{
int m;
double n;
m=(int)temp/100;
n=(temp-m*100)/60;
n=n+m;
return n; }
GPS数据读取与处理的更多相关文章
- 采集的GPS数据如何正确显示在arcgis和cad中
利用GPS定位卫星,在全球范围内实时进行定位.导航的系统,称为全球卫星定位系统,简称GPS.GPS是由美国国防部研制建立的一种具有全方位.全天候.全时段.高精度的卫星导航系统,能为全球用户提供低成本. ...
- OleDbDataReader快速数据读取方式
查询得到OleDbDataReader后,有三种方式支持数据读取,如下: //方法一**速度中等 OleDbDataReader reader = command.ExecuteReader(); w ...
- DataTable to Excel(使用NPOI、EPPlus将数据表中的数据读取到excel格式内存中)
/// <summary> /// DataTable to Excel(将数据表中的数据读取到excel格式内存中) /// </summary> /// <param ...
- geotrellis使用(二)geotrellis-chatta-demo以及geotrellis框架数据读取方式初探
在上篇博客(geotrellis使用初探)中简单介绍了geotrellis-chatta-demo的大致工作流程,但是有一个重要的问题就是此demo如何调取数据进行瓦片切割分析处理等并未说明,经过几天 ...
- 【原】Learning Spark (Python版) 学习笔记(二)----键值对、数据读取与保存、共享特性
本来应该上周更新的,结果碰上五一,懒癌发作,就推迟了 = =.以后还是要按时完成任务.废话不多说,第四章-第六章主要讲了三个内容:键值对.数据读取与保存与Spark的两个共享特性(累加器和广播变量). ...
- MATLAB对于文本文件(txt)数据读取的技巧总结(经典中的经典)
振动论坛原版主eight的经典贴http://www.chinavib.com/thread-45622-1-1.html MATLAB对于文本文件(txt)进行数据读取的技巧总结(经典中的经典)由于 ...
- TableInputFormat分片及分片数据读取源码级分析
我们在MapReduce中TextInputFormat分片和读取分片数据源码级分析 这篇中以TextInputFormat为例讲解了InputFormat的分片过程以及RecordReader读取分 ...
- Extjs的数据读取器store和后台返回类型简单解析
工作中用到了Extjs,从后台获取数据的时候,用到了extjs自己的Ext.data.store方法,然后封装了ExtGridReturn方法, 目的:前台用到Ext.data.store读取从后台传 ...
- Java学习-028-JSON 之二 -- 数据读取
JSON数据由 JSONObject.JSONArray.key_value 组合而成.通常来说,JSONObject 可以包含 JSONObject.JSONArray.key_value:JSON ...
随机推荐
- LINQ系列:Linq to Object转换操作符
转换是指将输入对象的类型转变为序列的动作. 1. AsEnumerable AsEnumerable操作符将查询的输入以IEnumberable(T)类型返回. 2. Cast Cast操作符将IEn ...
- 在 ML2 中配置 VXLAN - 每天5分钟玩转 OpenStack(110)
上一节我们介绍了 VXLAN 的基本概念,今天介绍如何在 ML2 中启用 VXLAN. 在 /etc/neutron/plugins/ml2/ml2_conf.ini 设置 vxlan network ...
- 你需要知道的包管理器(Package Manager)
最近我花了一点时间关注了在不同系统之中所用到的包管理器(Package Manager) .最开始的时候,我是在使用Linux操作系统时,对这种工具以及它背后的想法深深迷恋住了:这真是自由的软件世界. ...
- Android随笔之——Activity中启动另一应用
最近在写语音交互程序,在语音打开应用这块碰到如何用代码控制应用启动的问题.百度了一下,有两种方案:1.获取应用的包名:2.获取应用的包名.入口类名. 之前对两种方案都进行了尝试,发现方案二中存在一个弊 ...
- Oracle 11g 编译使用BBED
环境:RHEL 6.4 + Oracle 11.2.0.4 1. 拷贝缺失文件 2. 编译BBED 3. BBED使用测试 Reference 1. 拷贝缺失文件 11g中缺失几个相关文件,但我们实际 ...
- BOM详解
1.WINDOW对象 BOM的核心对象是WINDOW,它表示一个浏览器的实例.在浏览器中,window对象有双重角色,它既是通过 JavaScript访问浏览器的一个接口,又是ECMAScript规定 ...
- 【JUC】JDK1.8源码分析之SynchronousQueue(九)
一.前言 本篇是在分析Executors源码时,发现JUC集合框架中的一个重要类没有分析,SynchronousQueue,该类在线程池中的作用是非常明显的,所以很有必要单独拿出来分析一番,这对于之后 ...
- Mybatis - 动态sql
learn from:http://www.mybatis.org/mybatis-3/dynamic-sql.html mybatis支持动态拼接sql语句.主要有: if choose (when ...
- SQL Server基础之《视图的概述和基本操作》
数据库中的视图是一个虚拟表.同真实的表一样,视图包含一系列带有名称的列和行数据,行和列数据用来自由定义视图和查询所引用的表,并且在引用视图时动态产生.本篇将通过一些实例来介绍视图的概念,视图的作用, ...
- 让我们一起用开源数据库和开源框架废弃Access
一.为什么要废弃Access? 1.客户的机子上需要安装access的驱动 ps:这个比较烦人,大家都知道部署越简单越好,安装这个对用户来说太繁琐了. 2.操作时性能不佳 using System; ...