资源描述
沈阳航空航天大学
课 程 设 计 报 告
课程设计名称:物联网综合课程设计
课程设计题目:高度测量
院(系):计算机学院
专 业:计算机科学与技术(物联网技术方向)
班 级:34010105
学 号:2013040101216
姓 名:蔡新建
指导教师:张维君
说明:结论(优秀、良好、中等、及格、不及格)作为相关教环节考核必要依据;格式不符合要求;数据不实,不予通过。报告和电子数据必须作为实验现象重复的关键依据。
沈阳航空航天大学课程设计报告
学术诚信声明
本人声明:所呈交的报告(含电子版及数据文件)是我个人在导师指导下独立进行设计工作及取得的研究结果。尽我所知,除了文中特别加以标注或致谢中所罗列的内容以外,报告中不包含其他人己经发表或撰写过的研究结果,也不包含其它教育机构使用过的材料。与我一同工作的同学对本研究所做的任何贡献均己在报告中做了明确的说明并表示了谢意。报告资料及实验数据若有不实之处,本人愿意接受本教学环节“不及格”和“重修或重做”的评分结论并承担相关一切后果。
本人签名: 日期: 年 月 日
沈阳航空航天大学
课程设计任务书
课程设计名称
物联网综合课程设计
专业
计算机科学与技术(物联网技术方向)
学生姓名
蔡新建
班级
34010105
学号
2013040101216
题目名称
高度测量
起止日期
2016年12月19日起至2017年1月13日止
课设内容和要求:
一 课程设计内容
1. 采集GPS模块的信息;
2. 将高度信息传送到计算机;
3. 在计算机上显示高度信息。
二 课程设计要求
1 认真查阅相关资料;
2 独立设计,调试并通过指导老师现场验收;
3 撰写课程设计报告 ;
参考资料:
[1] 青岛东合信息技术有限公司. 无线传感器网络技术原理及应用[M]. 西安:西安电子科技大学出版社,2013
[2] 凌阳爱普科技有限公司. 物联网多网技术综合教学开发平台实验指导书[M],2013
[3] 王小强,欧阳俊,黄宁淋. ZigBee无线传感器网络设计与实现[M]. 北京:化学工业出版社,2012
教研室审核意见:【 】同意立题,【 】不同意 教研室主任签字:
指导教师(签名)
2016年12月19日
学生签名
2016年12月19日
课程设计总结:
本次课设中主要用到了Linux操作系统的基本操作、嵌入式C语言的编程、数据通信等知识,虽然以前修过相关课程,但是没有应用到实际实践中,通过查阅相关资料和网络论坛的讲解,我对原来学的知识有了更深刻的理解。最终在老师的指导和同学的帮助下,如期完成了课程设计内容。
本次课程设计是与GPS相关的物联网技术,本学期曾选修过一门GPS课程,因为是选修课所以学的并不好,现在通过课程设计使自己对GPS的相关知识更加了解,同时在查阅相关资料的同时,还翻看了一些关于中国北斗卫星系统的知识,心中有一种自豪感,为我伟大的祖国感到自豪。
本次课程设计使用的源代码是在课上实验代码的基础上进行编写的,通过查看CSDN上的相关博客,是自己慢慢理解代码并进行了修改。开始的时候代码运行总是不能出现预期结果,相似课设题目的同学猜测是实验箱的问题,也有说是GPS模组的问题,后来我们一步一步的调试,跟换实验箱和GPS模组,最终实现了课设要求的功能,在整个过程中最大的收获就是遇到困难要不断的想解决方案,一步一簇进行调试排除问题,而不是放弃。
在整个课设中,不仅加深了对已修课程的理解,也增强了动手实践能力,同时体会到了编程调试过程中的快乐。
目 录
学术诚信声明 I
第1章 总体设计方案 1
1.1 课程设计的内容和要求 1
1.2 课程设计原理 1
1.2.1 GPS原理叙述: 1
1.2.2 NMEA格式解释 3
1.2.3GPS模组电路 4
1.3 课程设计思路 6
第2章 详细设计方案 7
2.1 课程设计环境搭建 7
2.1.1 Ubuntu 10.10 的安装 7
2.1.2通过网线和串口将PC和A8实验箱进行连接 8
2.1.3 GPS模块的连接 10
2.1.4软件设计与实现 10
2.2 实施方案 12
第3章 调试及结果分析 14
3.1 调试 14
3.1.1 软件测试 14
3.1.2 硬件调试 14
3.2 结果 14
附 录(关键部分程序清单) 16
25
沈阳航空航天大学课程设计报告
第1章 总体设计方案
1.1 课程设计的内容和要求
1.1.1课程设计内容:
1. 文献检索,查阅资料了解凌阳A8实验箱和GPS模块的相关知识;
2. 通过GPS模块采集相关的信息;
3. 将NMEA回传给凌阳实验箱;
4. 通过超级终端将解析出来的高度信息显示在计算机上。
1.1.2课程设计要求:
1. 认真查阅相关资料;
2. 独立设计,调试并通过指导老师现场验收;
3. 撰写课程设计报告。
1.2 课程设计原理
1.2.1GPS原理叙述:
GPS(全球定位系统)是美国从本世纪 70 年代开始研制,历时20 年,耗资 200 亿美元,具有在海、陆、空进行全方位实时三维导航与定位能力的新一代卫星导航与定位系统。
GPS 在空间中有21颗工作卫星3颗备用卫星,在地面上有1 个主控站, 3 个注入站, 5 个监测站组成,用户通过设备接收GPS卫星发射的卫星信号获得导航和定位信息,经过数据解析和处理获取高度,经纬度等信息。
GPS 具有如下特性:
1) 全球,全天候工作:能为用户提供连续、实时的三维位置、三维速度和精密时间。不受天气的影响。
2) 定位精度高:单机定位精度优于 10 米;采用差分定位精度可达厘米或毫米级。
3) 功能多,应用广:目前已广泛应用于大地测量、工程测量、航空摄影测量、运载工具导航和管制、地壳运动监测、工程变形监测、资源勘察、地球动力学等学科领域。
GPS 由三个独立的部分组成:
空间部分:21 颗工作卫星,3 颗备用卫星。
地面支撑系统:1 个主控站,3 个注入站,5 个监测站。
用户设备部分:接收 GPS 卫星发射信号,以获得必要的导航和定位信息,经数据处理,完成导航和定位工作。GPS 接收机硬件一般由主机、天线和电源组成。
图 GPS全球定位示意图
GPS 定位的基本原理:根据高速运动的卫星瞬间位置作为已知的数据,采用空间距离后方交会的方法,确定待测点的位置。假设 t 时刻在地面待测点上安置 GPS 接收机,可以测定 GPS 信号到达接收机的时间△t,再加上接收机所接收到的卫星星历等数据可以确定以下四个方程式:
上述四个方程式中待测点坐标 x、y、z 和 V t0 为未知参数,其中 di=cti (i=△1、2、3、4)。di (i=1、2、3、4) 分别为卫星 1、卫星 2、卫星 3、卫星 4 到接收机之间的距离。ti (i=△1、2、3、4) 分别为卫星 1、卫星 2、卫星 3、卫星 4 的信号到达接收机所经历的时间。c 为 GPS 信号的传播速度(即光速)。
四个方程式中各个参数意义如下:
x、y、z 为待测点坐标的空间坐标。xi 、yi 、zi (i=1、2、3、4) 分别为卫星 1、卫星 2、卫星3、卫星 4 在 t 时刻的空间坐标,可由卫星导航电文获得。Vti (i=1、2、3、4) 分别为卫星 1、卫星 2、卫星 3、卫星 4 的卫星钟的钟差,由卫星星历提供。Vto 为接收机的钟差。由以上四个方程即可计算出待测点的坐标 x、y、z 和接收机的钟差 Vto 。
1.2.2 NMEA格式解释
GPS模块返回的位置信息是按照NMEA 协议格式,NMEA是一套定义接收机输出的标准信息,有几种不同的格式,每种都是独立相关的ASCII格式,逗点隔开数据流,数据流长度从30-100字符不等,通常以每秒间隔选择输出,通常的的格式为"GP"开头,它包含了定位时间,纬度,经度,高度,定位所用的卫星数,其他的有速度,跟踪,日期等。NMEA-0183协议定义的语句非常多,但是常用的或者说兼容性最广的语句只有$GPGGA、$GPGSA、$GPGSV、$GPRMC、$GPVTG、$GPGLL等,说明如下:
$GPGGA(定位信息)eg:$GPGGA,092204.999,4250.5589,S,14718.5084,E,1,04,24.4,19.7,M,,,,0000*1F
GPGSA(当前卫星信息)eg:$GPGSA,A,3,01,20,19,13,,,,,,,,,40.4,24.4,32.2*0A
$GPGSV(可见卫星信息)
eg:$GPGSV,3,1,10,20,78,331,45,01,59,235,47,22,41,069,,13,32,252,45*70
$GPVTG(地面速度信息)
eg:$GPVTG,89.68,T,,M,0.00,N,0.0,K*5F
$GPGLL(地理定位信息)
$GPGLL,4250.5589,S,14718.5084,E,092204.999,A*2D
其中GPGGA的格式如下:$GPGGA,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,M,<10>,M,<11>,<12>*hh<CR><LF>
<1> UTC时间,hhmmss(时分秒)格式
<2> 纬度ddmm.mmmm(度分)格式(前面的0也将被传输)
<3> 纬度半球N(北半球)或S(南半球)
<4> 经度dddmm.mmmm(度分)格式(前面的0也将被传输)
<5> 经度半球E(东经)或W(西经)
<6> GPS状态:0=未定位,1=非差分定位,2=差分定位,6=正在估算
<7> 正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)
<8> HDOP水平精度因子(0.5~99.9)
<9> 海拔高度(-9999.9~99999.9)
<10> 地球椭球面相对大地水准面的高度
<11> 差分时间(从最近一次接收到差分信号开始的秒数,如果不是差分定位将为空)
<12> 差分站ID号0000~1023(前面的0也将被传输,如果不是差分定位将为空)
1.2.3GPS模组电路
GPS 模组的电路如下图所示,该模组采用 APM7101 主芯片,它集成了 SiRFstarIII GPS 处理器,LNA 电路,SAW 滤波器,振荡和校准电路;模组引出了 UART 通信接口和复位接口。
图 GPS模组电路图
GPS 模组具有以下特性:
1. 20 个通道接收
2. 弱信号下快速 TTFFs(Time to First Fix)
3. 两个 UART 收发通道
4. 接收灵敏度可达-159dBm
5. 支持 NMEA-0183 和 SiRF 协议
6. 支持 SBAS(WAAS、EGONS)
GPS 模块带有一个 10 针的接口,该接口可以直接和 MCU 相连接或者通过 RS232 转换模块和PC 机相连接使用。
GPS 模块需通过 MCU 向 GPS 模块的 RST(Pin2)引脚输入如图所示的上电时序 GPS 才能被启动,启动后 GPS 的信号指示灯会周期闪烁。
图 GPS模块启动时序图
GPS 启动后会间隔一定时间返回一次接收信息,其返回信息包括:GGA(1sec) / GSA(1sec) / MC(1sec) / GSV(5sec),通常我们仅关注其中 RMC 信息。
1.3 课程设计思路
根据课程设计题目要求,首先要对实验箱和PC机以及GPS模块进行连接,并对通信传输速率以及IP进行设置,其次要在PC机上对实验程序进行编辑,并复制到Ubuntu系统中,最后将在Ubuntu系统下编译的文件下载到A8实验箱,使其运行显示结果。
沈阳航空航天大学课程设计报告
第2章 详细设计方案
2.1 课程设计环境搭建
嵌入式开发环境一般为Linux环境,通常的嵌入式系统的软件开发采用一种交叉编译调试的方式。交叉编译调试环境建立在宿主机(即一台 PC 机)上,对应的开发板叫做目标板。宿主机和目标板的处理器一般不相同,宿主机为 x86 处理器,而目标板如凌阳的 A8 实验箱为三星 S5PV210,其为 ARM A8 架构的处理器。 GNU 编译器提供这样的功能,在编译器编译时可以选择开发所需的宿主机和目标机从而建立开发环境。所以在进行嵌入式开发前第一步的工作就是要安装一台装有指定操作系统的 PC 机作宿主开发机,对于嵌入式 Linux,宿主机上的操作系统一般要求为 Linux 的各种发行版,本次课程设计采用Ubuntu10.10,同时安装gcc交叉编译器。环境搭建流程如图:
2.1.1 Ubuntu 10.10 的安装
嵌入式 Linux 的 PC 开发环境有几个方案:
1. 基于 PC 机 Windows 操作系统下 Cygwin
2.在 Windows 下安装虚拟机后,再在虚拟机中安装 Linux 操作系统
3.直接安装 Linux 操作系统
以上三种方案各有千秋,方案一容易存在兼容性问题;方案二在 PC 配置比较低的情况下会比较慢,但是既可以使用 Windows 上的一些软件又可以使用到比较好的 Linux 环境,熟悉 Windows的用户用此方案比较顺手;方案三无法使用 Windows 上的一些常用软件,并且不熟悉的人操作起来比较困难。签于此笔者建议初学者选择方案二。
方案二首先要在 Windows 上安装一个虚拟机软件,常用的虚拟机软件为 Vmware。然后再在Vmware 上安装 Ubuntu 10.10。在安装完 Ubuntu 10.10 后还要安装嵌入式 Linux 的交叉编译器和开发库以及 ARM-Linux 的所有源代码,这些包安装后的总共需要空间大约为 800M。
2.1.2通过网线和串口将PC和A8实验箱进行连接
通过操作PC机的超级终端登陆实验箱的系统,通过网线连接是有两种方案:
1. 实验箱的以太网接口与 PC 的网卡直接相连。
2. 将实验箱与路由器相连。
当在实验室通过方案2连接PC机和A8实验箱时,容易出现ip冲突等问题,所以直接将用网线将实验箱的以太网接口和PC的网卡直接相连。此时需要将A8实验箱和PC机设置在同一网段才能正常通信。具体步骤如下:
1) 通过超级终端建立连接并登陆到A8实验箱的系统中(账号:root,密码:111111)
登陆成功
2)对A8实验箱的IP进行配置,并重启网络服务器。(主要用到的Linux语句:ipconfig eth0 -i 192.168.1.100 -m 255.255.255.0 -g 192.168.1.1和service network restart)
更改IP并重启网络服务器
3)更改主机电脑的IP(注意将宿主机和实验箱IP设置在同一网段)
更改宿主机IP
2.1.3 GPS模块的连接
实验箱引出了 GPS 接口 J33,直接把 GPS 模组插接到该接口上,即可实现对 GPS 模组的控制。其中 GPS 模组的复位信号由实验箱 GPJ4_0 来控制,通信由实验箱的 UART2 来完成。按照APM7101 的通讯要求,UART 通讯波特率为 4800 或者 9600bps。
2.1.4软件设计与实现
软件实现是本设计的重点,使用的是嵌入式 C语言编程,采用模块化的设计思想,根据系统要求和相关的硬件电路。
本设计中,程序首先通过 GPJ4_0 输出 GPS 模组开启所需时序,从而打开 GPS 模组,接下来即可通过 UART2 等待从 GPS 模组中读取 GPS 信息,并将这些这些信息进行解析,即可得到所需信息。本设计的程序流程如下图所示:
图 软件程序流程图
具体的软件程序流程为:
1. 打开 Linux 下相应的设备挂载点,开启 GPS 模块并进行初始化。本设计中,程序通过 GPJ4_0 输出 GPS 模组开启所需时序,从而打开 GPS 模组,接下来可通过 UART2 等待从 GPS 模组中读取 GPS 信息,并将这些信息进行解析,即可得到所需信息。
2. 打开并设置 UART2 属性。为了实验箱能够正确地与 PC 进行通信,必须按照制定要求格式对通信串口进行初始化操作。本设计选择实验箱主电路板上的 UART2 串口进行与 PC 的通信,并设置通信波特率为 115200、数据位为 8 位、无奇偶校验位、1 位停止位和无数据流控制。具体实现过程可以通过向设备中发送起始信号,设备地址和写信号,然后发送内部寄存器的地址和数据,发送结束后便发送停止信号。
3. 读取 GPS 信息并解析。GPS 模组返回的信息遵循 NMEA 协议格式。为了正确无误地读取 GPS 模组中返回的信息,我们必须按照 NMEA 消息格式对缓冲区中的消息进行读取并存储并通过函数GetComma(int num,char *str) 得到指定序号的逗号位置,以解析各个定义段。基本 NMEA 指令是一个 ASCII 字符串,它以‘$‘字符开始、以<CR><LF>序列结束。NMEA标准消息以“GP”开始,接着是三个字符的消息标识码。消息头和后面的内容通过逗号进行分隔,消息以校检码结束(校检码由一个‘*’和两个 16 位的校验字组成。校验码字段并不用逗号进行分隔。目前,校验码得到的方式是从‘$’到‘*’之间的字符进行逐位计算。)
2.2 实施方案
1. 按照设计原理及设计思路在PC机上编写程序,保存成 .c 源代码文件,并将文件拷贝到Ubuntu系统中。
2. 在 Ubuntu 操作系统中打开一个终端,进入到源程序所在目录下,在Ubuntu中进行交叉编译,运行命令行(通过ls查看查看到GPS216文件):arm-linux-gcc -o GPS216 GPS.c
3. 在 PC 机,通过 ftp 协议访问实验箱的 IP 地址,将编译好的GPS216 文件传输到实验箱中。
4. 在超级终端中,赋予文件可执行权限并运行。(授权语句:chmod +x GPS216)
第3章 调试及结果分析
3.1 调试
3.1.1 软件测试
通过查找众多资料,终于确定了整个设计方案,即使用S5PV210 CPU板模块和GPS模块作为本设计的核心芯片。在参考了各种GPS解析函数和以上的电路原理后,开始进行软件测试。
3.1.2 硬件调试
当按照以上原理和要求连接调试后,发现并没有出现预期现象,甚至出现超级终端黑屏现象,所以在课设源代码中设计了输出“此时的GPS信息为:”以此判断GPS模组获取合法信息,同时在经过不断的查阅资料后,发现GPS模组收到环境影响比较大,首先就是需要将模组放在里窗比较近的位置才能获得相应的GPS信息。根据GPS的运行原理,课设结果会受到天气环境的影响,比如空气的湿度,大气层的云层厚度等因素,所以课设结果会有些许偏差。
3.2 结果
当根据实验原理设计并运行后,超级终端可以出现如下实验结果:
参考文献
[1] 青岛东合信息技术有限公司. 无线传感器网络技术原理及应用[M]. 西安:西安电子科技大学出版社,2013
[2] 凌阳爱普科技有限公司. 物联网多网技术综合教学开发平台实验指导书[M],2013
[3] 王小强,欧阳俊,黄宁淋. ZigBee无线传感器网络设计与实现[M]. 北京:化学工业出版社,2012
[4] 凌阳爱普科技有限公司. A8实验箱综合教学开发平台实验指导书[M],2013
[5] 王毓银.数字电路逻辑设计.高等教育出版社,1999
[6] 梁德厚.数字电路技术及应用.机械工业出版社,2004
[7] 杨松华.数字电子技术基础.西安电子科技大学出版社,2000
沈阳航空航天大学课程设计报告
附 录(关键部分程序清单)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/ioctl.h>
typedef struct{
int year;
int month;
int day;
int hour;
int minute;
int second;
char time_c[10];//ACSII形式的时间
}date_time;
typedef struct{
date_time D; //时间
char status; //接收状态
double latitude; //纬度
char latitude_c[11]; //ASCII形式的纬度
double longitude; //经度
char longitude_c[11];//ASCII形式的经度
char NS; //南北极
char EW; //东西
double speed; //速度
char speed_c[10]; //ASCII形式的速度
double high; //高度
}GPS_INFO;
int GPS_Read(int fd, char *Data_Buff, int len);
int GetComma(int num,char* str);
void UTC2BTC(date_time *GPS);
double Get_Double_Number(char *s);
void Get_Char(char *s);
char buf_t[128];
int main()
{
struct termios options, oldoptions;
// 定义串口属性结构体变量,其中options用于重新设置串口属性,oldoptions用于原设置,用于恢复到原来的属性
GPS_INFO GPS;
unsigned int Degree = 0;
float Cent;
char buf[1024];
int len = 1024;
int nByte;
int rdadByte;
int i=0;
int fd;
fd = open("/dev/gpJ4", O_RDWR); // open GPJ4
ioctl(fd, 0x01, 0); // set GPJ4_0 output
ioctl(fd, 0x10, 0); // GPJ4_0 output low level
usleep(30000);
ioctl(fd, 0x11, 0); // GPJ4_0 output high level
fd = open("/dev/s3c2410_serial2", O_RDWR); // open serial 2
tcgetattr(fd, &oldoptions); // 获得当前的串口设置信息
tcgetattr(fd, &options);
cfsetispeed(&options, B9600); // 设置输入波特率为115200
cfsetospeed(&options, B9600); // 设置输出波特率为115200
options.c_cflag &= ~PARENB; // 设置串口属性为:数据位为8位,停止位为1位,无奇偶校验
options.c_cflag &= ~CSTOPB;
options.c_cflag |= CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag &= ~CS8;
options.c_cflag |= CS8;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 设置串口为Raw模式
options.c_oflag &= ~OPOST;
tcsetattr(fd, TCSANOW, &options); // 将上述设置生效
while(1)
{
GPS_Read(fd, buf , len);
if(GPS_Parse(buf,&GPS))
{
if(GPS.status == 'A') // 如果接收到有效的数据
{
printf("时间: %2d:%2d:%2d\n", // 显示时间
GPS.D.hour,GPS.D.minute,GPS.D.second);
printf("日期: %d年%02d月%02d日\n", // 显示日期
GPS.D.year,GPS.D.month,GPS.D.day);
printf("此时的海拔高度为:%10.4f \n",GPS.high);
Degree = GPS.latitude/100; // 计算纬度的"度"和"分"
Cent = GPS.latitude - (Degree * 100);
printf("纬度: "); // 显示纬度
if(GPS.NS == 'N')
printf("北纬(N)%d度%lf分 ",Degree,Cent);
if(GPS.NS == 'S')
printf("南纬(S)%d度%lf分 ",Degree,Cent);
printf("\n");
Degree = GPS.longitude/100; // 计算经度的"度"和"分"
Cent = GPS.longitude - (Degree * 100);
printf("经度: "); // 显示经度
if(GPS.EW == 'E')
printf("东经(E)%d度%lf分",Degree,Cent);
if(GPS.EW == 'W')
printf("西经(W)%d度%lf分",Degree,Cent);
printf("\n\n\n");
}
}
}
}
/******************************************
* GPS_Read : read MSG from GPS module *
*******************************************/
int GPS_Read(int fd, char *Data_Buff, int len)
{
int count = 0;
int Flag = 0;
while(Flag==0)
{
read(fd, Data_Buff, 1);
if(*Data_Buff == '\n')
{
Flag = 1;
count = 0;
}
Data_Buff++;
}
return 0;
}
/********************************************************
* GPS_Parse : change MFS from GPS to sturct GPS_INFO *
*********************************************************/
int GPS_Parse(const char *line,GPS_INFO *GPS)
{
int tmp;
char c;
char* buf ;
buf = (char *)line;
c=buf[5];
if(c=='C'){//"GPRMC"
GPS->D.hour =(buf[ 7]-'0')*10+(buf[ 8]-'0');
GPS->D.minute =(buf[ 9]-'0')*10+(buf[10]-'0');
GPS->D.second =(buf[11]-'0')*10+(buf[12]-'0');
tmp = GetComma(9,buf);
GPS->D.day =(buf[tmp+0]-'0')*10+(buf[tmp+1]-'0');
GPS->D.month =(buf[tmp+2]-'0')*10+(buf[tmp+3]-'0');
GPS->D.year =(buf[tmp+4]-'0')*10+(buf[tmp+5]-'0')+2000;
Get_Char(&buf[7]);
strcpy(GPS->D.time_c,buf_t);
//------------------------------
GPS->status =buf[GetComma(2,buf)];
#define ddd
GPS->latitude =Get_Double_Number(&buf[GetComma(3,buf)]);
printf("GPS->latitude = %f\n",GPS->latitude);
GPS->NS =buf[GetComma(4,buf)];
Get_Char(&buf[GetComma(3,buf)]);
strcpy(GPS->latitude_c,buf_t);
GPS->longitude =Get_Double_Number(&buf[GetComma(5,buf)]);
GPS->EW =buf[GetComma(6,buf)];
Get_Char(&buf[GetComma(5,buf)]);
strcpy(GPS->longitude_c,buf_t);
UTC2BTC(&GPS->D);
return 1;
}
if(c=='A'){ //"$GPGGA"
GPS->high = Get_Double_Number(&buf[GetComma(9,buf)]);
return 1;
}
return 0;
}
/*********************************************************************
* Get_Double_Number : change string before the frist ',' to double *
*********************************************************************/
double Get_Double_Number(char *s)
{
char buf[128];
int i;
double rev;
i=GetComma(1,s);
i=i-1;
strncpy(buf,s,i);
buf[i]=0;
rev=atof(buf);
return rev;
}
/******************************************
* Get_Char : get char before frist "," *
*******************************************/
void Get_Char(char *s)
{
int i;
i=GetComma(1,s);
i=i-1;
if(i>9)i=9;
strncpy(buf_t,s,i);
buf_t[i]='\n';
}
/******************************************
* GetComma : get poistion of num-th "," *
*******************************************/
int 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;
}
/******************************************
* UTC2BTC : get BeiJing time *
*******************************************/
void UTC2BTC(date_time *GPS)
{
GPS->second++;
if(GPS->second>59){
GPS->second=0;
GPS->minute++;
if(GPS->minute>59){
GPS->minute=0;
GPS->hour++;
}
}
//------------------------------转化为北京时间-----------------------------//
GPS->hour=GPS->hour + 8;
if(GPS->hour>23)
{
GPS->hour-=24;
GPS->day+=1;
if(GPS->mon
展开阅读全文