串口编程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转串口 — ...
随机推荐
- (转)linux访问windows共享文件夹的两种方法
有时需要在linux下访问window的共享文件,可以使用mount挂载或使用samba连接. 1,mount挂载 $ mkdir windows 将共享文件夹挂载到windows文件夹: mount ...
- Windows存储管理之磁盘结构详解
Windows磁盘结构: Windows的主流磁盘结构分为MBR和GPT两种.MBR是早期Windows的唯一选择,但是随着物理磁盘的容量不断增大.GPT结构成为目前的主流,最大支持超过2TB的容量, ...
- linux 7- - watch,free,mpstat,vmstat,iostat,pidstat,df,du
十八. 和系统运行状况相关的Shell命令: 1. Linux的实时监测命令(watch): watch 是一个非常实用的命令,可以帮你实时监测一个命令的运行结果,省得一遍又一遍的 ...
- C#访问数据库的步骤
1.必须导入包含适当的ADO.NET类的名称空间 2.获取具体的数据库连接字符串. 3.实例化Connection对象,并建立.打开连接. 4.使用Command对象,从数据库存取器中读取数据和向数据 ...
- rails 命名
1.model rails g model wordSetting model:WordSetting has_many: word_settings table: word_settings vie ...
- runtime-分类为什么不生成setter和getter
前言 前几天有人问我一个问题:为什么分类不能自动创建get set方法.老实说,笔者从来没有去思考过这个问题.于是这次通过代码实践跟runtime源码来探究这个问题. 准备工作 为了能减少输出类数据的 ...
- hbase shell-security(安全指令)
hbase shell安全指令篇: grant list_security_capabilities revoke user_permission 正在编辑中
- hbase shell-ddl(表定义指令)
hbase表定义指令详细解说篇 1. alter, alter_async, alter_status 2. create 3. describe (可以简写成'desc') 显示某张表的结构情况 ...
- EntityFramework 学习 一 Disconnected Entities
如何把断开的实体添加到新的context上下文中 1.首先,我们需要把实体附加到新的context上下文实例中. 2.其次,手动的给实体设置适当的实体状态,因为新的context上下文不知道断开的实体 ...
- github之克隆
git clone --depth=10 git_仓库_url 只会获取最近 xx(10条提交记录的)代码,默认是master分支, 如果想要指定分支,可以结合 -b --single--branch ...