⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gps.c

📁 GPS 数据接收分析
💻 C
字号:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <intrins.h>
#include "gps.h"
#include "valueE.h"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int


/*************************************
/*"GPS数据"
/************************************/

typedef struct
{
	uchar status;
	uchar GPS_type;	
	uchar time_hour;
	uchar time_min;
	uchar time_sec;
	uchar hbit;
	uchar latitude[4];
	uchar longitude[4];
	uchar vector;
	uchar direction;
	uchar day;
	uchar month;
	uchar year;
	uchar checksum;
}GPS_t;

GPS_t  gps;
/*************************************
/*"16进制两字符化成16进制"
/************************************/
unsigned char StrToHex(char *str)
{
	unsigned char val;
	val=str[0]-48;
	if (val>9) val -=7;
	if (str[1]>64)
	{
		val=(_crol_(val,4)& 0xf0)+str[1]-55;
	}
	else
	{
		val=(_crol_(val,4)& 0xf0)+str[1]-48;
	}
	return val;
}
/*************************************
/*"从字符串前取出逗号前的字串"
/************************************/
void getstr(char *mes,char *str)
{
	unsigned char i ;
	i=0;
	while ((mes[i]!=',')&&(mes[i]!=0))
	{
		str[i]=mes[i];
		i++;
	}
	str[i]=0;
	if (mes[i]==',')
	{
		strcpy(mes,&mes[i+1]);
	}
}

/*************************************
/*"MCU串口数据接收"
/************************************/

//***********************************************************************************************************************
//函数作用:接收comm0回应数据包
//参数说明:
//注意事项:
//返回说明:如果接受到了完整包 返回1
//***********************************************************************************************************************
unsigned char getmes(char *mes)
{	
	uchar data temp;
	uchar meslen=0;
	if(uart0_r_buf_wptr==uart0_r_buf_rptr)return 0;


	//接收直到没有数据
	while(uart0_r_buf_wptr==uart0_r_buf_rptr)
	{
		temp=uart0_r_buf[uart0_r_buf_rptr];//得到当前要读取的字符
		uart0_r_buf_rptr++;//指向下一个要读取的字符
		if(uart0_r_buf_rptr==UART0_R_BUF_SIZE)uart0_r_buf_rptr=0;//如果到了fifo末尾 则重从头开始
		
		if(temp=='\r')//判断结束符号
		{
			mes[meslen]=0;//添加结束符
			if(meslen)return 1;
		}
		else if(temp=='\n')//过滤垃圾字符
		{

		}
		else		//正常字符
		{
			mes[meslen++]=temp;//向缓存送数据			
			if(meslen>=sizeof(mes)-1)//判断是否超长
			{
				mes[meslen]=0;//添加结束符
				return 1;
			}
		}
	}
	
	return 0;
}



/*************************************
/*"GPS数据处理"
/************************************/
void GPSProc(void)
{
//$GPRMC,154028.00,A,3904.86324,N,11712.04412,E,0.015,100.80,101204,,,A*6D
//$GPRMC,162007.00,V,,,,,,,101204,,,N*79
//$GPRMC,162006.00,V,,,,,,,101204,,,N*78
//DDCC.CCCC DDDCC.CCCC VVV.V
	char mes[100]="$GPRMC,154028.00,A,3904.86324,N,11712.04412,E,0.015,100.80,101204,,,A*6D";
	char temp[20];
	char mm[10];
//	memset(mes,0,sizeof(mes));
	memset(temp,0,sizeof(temp));
	memset(mm,0,sizeof(mm));
//	if (getmes(mes)!=0)
	{
		if (strncmp(mes,"$GPRMC",6)==0)
		{
			if (CheckAdd(mes)==0) return;
			getstr(mes,temp);
			getstr(mes,temp);
			getstr(mes,mm);
			if (mm[0]=='A')
			{
				A=1;
				gps.time_hour=(temp[0]-48)*10+(temp[1]-48);
				if (gps.time_hour>23) gps.time_hour=gps.time_hour-24;
				gps.time_min=(temp[2]-48)*10+(temp[3]-48);;
				gps.time_sec=(temp[4]-48)*10+(temp[5]-48);;

				getstr(mes,temp);
				gps.latitude[0]=(temp[0]-0x30)*10+(temp[1]-0x30);
				gps.latitude[1]=(temp[2]-0x30)*10+(temp[3]-0x30);
				gps.latitude[2]=(temp[5]-0x30)*10+(temp[6]-0x30);
				gps.latitude[3]=(temp[7]-0x30)*10+(temp[8]-0x30);

				getstr(mes,temp);
				getstr(mes,temp);
				gps.longitude[0]=(temp[0]-0x30)*100+(temp[1]-0x30)*10+(temp[2]-0x30);
				if(gps.longitude[0]<=0x7f) 
					G=0;
				else
				{
					G=1;
					gps.longitude[0]&=0x7f;
				}
				gps.longitude[1]=(temp[3]-0x30)*10+(temp[4]-0x30);
				gps.longitude[2]=(temp[6]-0x30)*10+(temp[7]-0x30);
				gps.longitude[3]=(temp[8]-0x30)*10+(temp[9]-0x30);

				getstr(mes,temp);
				getstr(mes,temp);
				gps.vector=atoi(temp);
				if(gps.vector<=0x7f) 
					V=0;
				else
				{
					V=1;
					gps.vector&=0x7f;
				}

				getstr(mes,temp);
				gps.direction=atoi(temp)/3+1;

				getstr(mes,temp);
				gps.day=(temp[0]-48)*10+(temp[1]-48);
				gps.month=(temp[2]-48)*10+(temp[3]-48);
				gps.year=(temp[4]-48)*10+(temp[5]-48);
			}
			else A=0;;
		}
		gps.status=gps_status;
	}
}
/*************************************
/*"获取检查和"
/************************************/
char CheckAdd(char *mes)
{
	unsigned char i,j;
	i=1;j=0;
	while ((mes[i]!='*')&&(mes[i]!=0))
	{
		j=j ^ mes[i];
		i++;
	}
	if (mes[i]=='*')
	{
		if (StrToHex(&mes[i+1])==j) return 1;
	}
	return 0;
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -