📄 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 + -