关于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)
{
int fd = 0;
int nread = 0;
GPRMC gprmc;
char gps_buff[GPS_LEN];
char *dev_name = "/dev/ttyUSB0";
fd = open(dev_name,O_RDWR|O_NOCTTY|O_NDELAY);
if(fd<0)
{
printf("open ttyUSB0 failed.\n");
return -1;
}
set_serial( fd,9600,8,'N',1);
while(1)
{
sleep(2);
nread = read(fd,gps_buff,sizeof(gps_buff));
if(nread<0)
{
printf("read GPS date error!!\n");
return -2;
}
printf("gps_buff: %s\n", gps_buff);
memset(&gprmc, 0 , sizeof(gprmc));
gps_analyse(gps_buff,&gprmc);
print_gps(&gprmc);
}
close(fd);
return 0;
}
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)
{
return -1;
}
if(strlen(buff)<10)
{
return -1;
}
if(NULL==(ptr=strstr(buff,"$GPRMC")))
{
return -1;
}
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));
return 0;
}
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("== 日期 : 20%02d-%02d-%02d \n",gps_data->date%100,(gps_data->date%10000)/100,gps_data->date/10000);
printf("== 时间 : %02d:%02d:%02d \n",(gps_data->time/10000+8)%24,(gps_data->time%10000)/100,gps_data->time%100);
printf("== 纬度 : 北纬:%d度%d分%d秒 \n", ((int)gps_data->latitude) / 100, (int)(gps_data->latitude - ((int)gps_data->latitude / 100 * 100)), (int)(((gps_data->latitude - ((int)gps_data->latitude / 100 * 100)) - ((int)gps_data->latitude - ((int)gps_data->latitude / 100 * 100))) * 60.0));
printf("== 经度 : 东经:%d度%d分%d秒 \n", ((int)gps_data->longitude) / 100, (int)(gps_data->longitude - ((int)gps_data->longitude / 100 * 100)), (int)(((gps_data->longitude - ((int)gps_data->longitude / 100 * 100)) - ((int)gps_data->longitude - ((int)gps_data->longitude / 100 * 100))) * 60.0));
printf("== 速度 : %.3f m/s \n",gps_data->speed);
printf("== \n");
printf("============================================================\n");
return 0;
}
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日,这个日期是准确的,不需要转换。