串口编程3:使用串口读取GPS信息
关于GPS的使用,参考。
本文主要参考的博客,在此表示感谢!!!
主函数
主函数gps_main.c,这里便涉及到了串口的打开,读操作,以及调用了串口设置函数:
#include <stdio.h> #include <string.h> #include <sys/types.h> #include <errno.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <termios.h> #include <stdlib.h> #include "gps.h" #define GPS_LEN 512 int set_serial(int fd,int nSpeed, int nBits, char nEvent, int nStop); int gps_analyse(char *buff,GPRMC *gps_date); int print_gps(GPRMC *gps_date); int main (int argc, char **argv) { ; ; GPRMC gprmc; char gps_buff[GPS_LEN]; char *dev_name = "/dev/ttyUSB0"; fd = open(dev_name,O_RDWR|O_NOCTTY|O_NDELAY); ) { printf("open ttyUSB0 failed.\n"); ; } set_serial( fd,,,); ) { sleep(); nread = read(fd,gps_buff,sizeof(gps_buff)); ) { printf("read GPS date error!!\n"); ; } printf("gps_buff: %s\n", gps_buff); memset(&gprmc, , sizeof(gprmc)); gps_analyse(gps_buff,&gprmc); print_gps(&gprmc); } close(fd); ; }
gps.h
#ifndef __GPS_H__ #define __GPS_H__ typedef unsigned int UINT; typedef int BYTE; typedef long int WORD; typedef struct __gprmc__ { UINT time; char pos_state; float latitude; float longitude; float speed; float direction; UINT date; float declination; char dd; char mode; }GPRMC; extern int gps_analysis(char *buff,GPRMC *gps_date); extern int print_gps(GPRMC *gps_date); extern int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop); #endif
gps_analyse.c
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <sys/types.h> #include <errno.h> #include <sys/stat.h> #include <fcntl.h> #include "gps.h" int gps_analyse (char *buff,GPRMC *gps_data) { char *ptr = NULL; if(gps_data==NULL) { ; } ) { ; } if(NULL==(ptr=strstr(buff,"$GPRMC"))) { ; } sscanf(ptr,"$GPRMC,%d.000,%c,%f,N,%f,E,%f,%f,%d,,,%c*",&(gps_data->time),&(gps_data->pos_state),&(gps_data->latitude),&(gps_data->longitude),&(gps_data->speed),&(gps_data->direction),&(gps_data->date),&(gps_data->mode)); ; } int print_gps (GPRMC *gps_data) { printf(" \n"); printf(" \n"); printf("===========================================================\n"); printf("== 全球GPS定位导航模块 ==\n"); printf("===========================================================\n"); printf(" \n"); printf("===========================================================\n"); printf("== GPS状态位 : %c [A:有效状态 V:无效状态] \n",gps_data->pos_state); printf("== GPS模式位 : %c [A:自主定位 D:差分定位] \n", gps_data->mode); printf(,(gps_data->date%)/,gps_data->date/); printf(+)%,(gps_data->time%)/,gps_data->time%); printf(, ( * )), ( * )) - (( * ))) * 60.0)); printf(, ( * )), ( * )) - (( * ))) * 60.0)); printf("== 速度 : %.3f m/s \n",gps_data->speed); printf("== \n"); printf("============================================================\n"); ; }
1. 时间,这个是格林威治时间即世界时间(UTC),把它转换成我们用的北京时间(BTC),在这个时间基础上加8个小时。
2. 经纬度,GPRMC返回的纬度数据位ddmm.mmmm格式即度分格式,我们把它转换成常见的度分秒的格式,计算方法:如接收到的纬度是:3029.60430
3029.60430/100=30.2960430可以直接读出30度, 3029.60430–30*100=29.60430, 可以直接读出29分 ,(29.60430–29)*60 =0.60430*60=36.258读出36秒, 所以纬度是:30度29分36秒。
3. 南北纬东西经,N:北纬。S:南纬。E:东经。W:西经。
4. 速率,GPRMC返回的速率值是海里/时,单位是节,把它转换成千米/时,换算为:1海里=1.85公里,把得到的速率乘以1.85。
5. 航向,指的是偏离正北的角度
6. 日期,GPRMC的日期格式为:ddmmyy,如:040617表示2017年06月04日,这个日期是准确的,不需要转换。
串口编程3:使用串口读取GPS信息的更多相关文章
- Java串口编程学习2-读串口
如果读串口出现乱码,则: 1.可能是波特率设置不对 2.可能是数据编码格式不对 import gnu.io.*; import java.awt.*; import java.awt.event.Ac ...
- Linux串口编程详解(转)
串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...
- linux串口编程总结
串口本身.标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口以前被广泛用于连接计算机和终端设备和各种外部设备.尽管以太网接口和USB接口也是以一个串行流进行数据传送的.可是串口连接 ...
- win7系统下用vspd软件进行串口编程实例
http://blog.csdn.net/qiusuo800/article/details/8299777 目前,我在学习C#串口编程类的基础知识,在网上也找了一些资料,但都存在一些问题,现在他们基 ...
- storysnail的Windows串口编程笔记
storysnail的Windows串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据 ...
- 使用SerialPort 读取外置GPS信息和使用GeoCoordinateWatcher获取内置gps的信息
简介最近工作中需要读取gps设备的信息,平板本身有内置的gps设备,但是精度不够,就又添加了一个外置的gps.对于外置的gps,我们主要通过SerialPort类来获得串口的信息,然后对接收到的内容进 ...
- storysnail的Linux串口编程笔记
storysnail的Linux串口编程笔记 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据Ge ...
- PB串口编程资料(转)
----MSCOMM32参数基本介绍2008年03月29日 星期六 上午 11:37MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能.MSComm控件在串口编程时非常方便,程序 ...
- c#串口编程(转)
在单片机项目开发中,上位机也是一个很重要的部分,主要用于数据显示(波形.温度等).用户控制(LED,继电器等),下位机(单片机)与 上位机之间要进行数据通信的两种方式都是基于串口的: USB转串口 — ...
随机推荐
- 洛谷 4035 [JSOI2008]球形空间产生器
题目戳这里 一句话题意 给你 n+1 个 n 维点,需要你求出这个n维球的球心.(n<=10) Solution 这个题目N维的话确实不好想,反正三维就已经把我搞懵了,所以只好拿二维类比. 首先 ...
- [note]BSGS & exBSGS
BSGS (感觉这东西还是要写一下) BSGS主要用于求解形如\(x^k=y\pmod p\)(注意这里p与x互质)这样的方程的最小正整数解的问题 设\(m=\lceil\sqrt p\rceil,k ...
- java实现数字的反转
例如有一个数字是:19911002,要求是,我要得到它的反转后的数:20011991 实现如下: static void reverse(int a) { int rs = 0; while (a & ...
- 数组中去除重复的对象的简单方法and&&的使用
const arr = [ { name:'tom', age:15 }, { name:'rose', age:17 }, { name:'tom', age:11 }, { name:'rose' ...
- python基础19 -------面向对象终结篇(介绍python对象中各种内置命令)
一.isinstance()和issubclass()命令 1.isinstance(对象,类型) 用来判定该对象是不是此类型或者说是该对象是不是此类的对象,返回结果为True和False,如图所示. ...
- (转载)C #开源框架
Json.NET http://json.codeplex.com/ Json.Net 是一个读写Json效率比较高的.Net框架.Json.Net 使得在.Net环境下使用Json更加简单.通过Li ...
- flex 坐标系
全局坐标(舞台坐标) 本地坐标 内容坐标系 地图坐标(MapPoint) flash和flex针对不同的目的,提供了3种不同的坐标系 全局的就是(stage级别的) 本地坐标系(组件级别的) 内容 ...
- path.join()和path.resolve()区别
一.区别 1.path.join() 方法使用平台特定的分隔符作为定界符将所有给定的 path 片段连接在一起,然后规范化生成的路径. 2.path.resolve() 方法将路径或路径片段的序列解析 ...
- 0523 CSS知识点
高级选择器分为:后代选择器.子代选择器.并集选择器.交集选择器 后代选择器 使用空格表示后代选择器.顾名思义,父元素的后代(包括儿子,孙子,重孙子) .father .item .a p{color: ...
- Spring层面的事务管理
事务管理方式 1. 编程式事务管理 2. 声明式事务管理 建立于AOP之上,对指定的方法执行前后进行拦截,即在方法执行前开始或加入一个事务,执行完毕后根据结果提交或回滚事务. 方式: a. 配置文件中 ...