📄 gps.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: GPS_HANDLE.c
** Last modified Date: 2005-06-17
** Last Version: 1.0
** Descriptions: header file of GPS
**
**------------------------------------------------------------------------------------------------------
** Created by: Yehaoben
** Created date: 2005-06-17
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "GPS.h"
char GGA_DATA_L[] = {"$GPGGA"};
char GLL_DATA_L[] = {"$GPGLL"};
char GSA_DATA_L[] = {"$GPGSA"};
char GSV_DATA_L[] = {"$GPGSV"};
char RMC_DATA_L[] = {"$GPRMC"};
char VTG_DATA_L[] = {"$GPVTG"};
char STOP_COMMAND[] = {"$PFST,STOP\r\n"};
char START_COMMAND[] = {"$PFST,START,0\r\n"};
char ADD_ALL_COMMAND[] = {"$PFST,NMEA,F003,9600\r\n"};
GPSRawDataQ GPSDataQ[GPS_CMDNUM]; //保存GPS模块发出的未经处理的数据
uint8 GPSDataQNUM; //当前的队列
uint8 GPSDataQWPTR; //当前队列中接收到的字符位置
OS_EVENT *GPSRcv; //GPS接收到一帧数据
GPS_DATA_TYPE GPS_DATA; //经过分析的GPS数据
/*********************************************************************************************************
** Function name: GPSInit
**
** Descriptions: Initial GPS
**
** input parameters: None
** Returned value: None
**
** Used global variables: None
** Calling modules: None
**
** Created by: Yehaoben
** Created Date: 2005/06/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GPSInit(void)
{
uint8 i;
OS_ENTER_CRITICAL();
GPSDataQNUM = 0;
GPSDataQWPTR = 0;
for(i = 0; i < GPS_CMDNUM; i ++)
{
GPSDataQ[i].State = 0;//初始化缓存的状态
}
OS_EXIT_CRITICAL();
strcpy(GPS_DATA.UTC_Time," . . : ");
strcpy(GPS_DATA.UTC_Date," . .");
GPSRcv = OSSemCreate(0);//creat the recive signal;
}
/*********************************************************************************************************
** Function name: startchar
**
** Descriptions: check the string from head to end
**
** input parameters: * str :string pointer
** endch :end char
** Returned value: char * :return the string
**
** Used global variables: None
** Calling modules: None
**
** Created by: Yehaoben
** Created Date: 2005/06/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
char * startchar(char * str,char endch )
{
uint16 i=0;
char * Ptr;
Ptr=str;
while(str[i])
{
if(str[i]==endch)
{
str[i]=0;
return Ptr;
}
i++;
if(i>30)
break;
}
return NULL;
}
/*********************************************************************************************************
** Function name: StrTOUINT
**
** Descriptions: change string to 16 bits integer
**
** input parameters: * str :string pointer
** DBits :string length
** Returned value: uint16 :changed result
**
** Used global variables: None
** Calling modules: None
**
** Created by: Yehaoben
** Created Date: 2005/06/02
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
uint16 StrTOUINT(char * str,uint8 DBits)
{
uint8 i=0;
uint16 j=0;
if( DBits <= 5 )
{
do
{
if(str[i] != '.')
{
j=(str[i]-0x30)+j*10;
DBits--;
}
i++;
}while(DBits > 0);
}
return j;
}
/*********************************************************************************************************
** Function name: GPS_RVC_HANDLE
**
** Descriptions: Revice data and save into GPSDataQ
**
** input parameters: uint8 :one data
**
** Returned value: None
**
** Used global variables: None
** Calling modules: None
**
** Created by: Yehaoben
** Created Date: 2005/06/02
**-------------------------------------------------------------------------------------------------------
** Modified by: 谢陆伟
** Modified date: 2007/07/24
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GPS_RVC_HANDLE(uint8 ch)
{
uint8 i;
OS_ENTER_CRITICAL();
if(GPSDataQ[GPSDataQNUM].State == 1) //已经收到字符'$'
{
OS_EXIT_CRITICAL();
GPSDataQ[GPSDataQNUM].Data[GPSDataQWPTR] = ch;
if(ch == '$') //再次收到表示开头的标志,则丢弃以前接收的字符
{
GPSDataQWPTR = 0;
}
if(ch == 0x0d ) //收到表示命令结束的字符
{
GPSDataQ[GPSDataQNUM].Data[GPSDataQWPTR+1] = 0;
GPSDataQWPTR = 0;
OS_ENTER_CRITICAL();
GPSDataQ[GPSDataQNUM].State = 2; //表明收到完整的一帧数据
for(i=0; i<GPS_CMDNUM; i++)
{
if(GPSDataQ[i].State == 0)
{
GPSDataQNUM = i;
break; //找到空闲的GPSDataQ
}
}
OS_EXIT_CRITICAL();
if(i >= GPS_CMDNUM)
{
GPSDataQNUM = GPS_CMDNUM - 1;
OS_ENTER_CRITICAL();
GPSDataQ[GPSDataQNUM].State = 0;
OS_EXIT_CRITICAL();
}
OSSemPost(GPSRcv); //给GPS数据分析任务发送消息过去;
}
else //收到的字符不是0x0D,则是正常的GPS数据
{
GPSDataQWPTR ++;
}
if(GPSDataQWPTR >= GPS_CMDMaxSize) //数据溢出,则丢弃溢出之前这一帧中接收的所有字符
{
GPSDataQWPTR = 0;
OS_ENTER_CRITICAL();
GPSDataQ[GPSDataQNUM].State = 0;
OS_EXIT_CRITICAL();
}
}
else //还没有接收到表示一帧数据开头的字符'$'
{
OS_EXIT_CRITICAL();
if( ch == '$') //判断接收的字符是否是'$',不是则直接丢弃
{
GPSDataQ[GPSDataQNUM].Data[GPSDataQWPTR] = ch;
GPSDataQWPTR ++;
OS_ENTER_CRITICAL();
GPSDataQ[GPSDataQNUM].State = 1; //表示已经接收到'$'
OS_EXIT_CRITICAL();
}
}
}
uint8 CheckSum(const char *str)
{
uint32 i,len;
uint8 sum1,sum2;
sum1 = 0;
len = strchr(str,'*') - str;
if(len > 80) return 0;
for(i=1;i<len;i++)
{
sum1 ^= str[i];
} //得到所有字符的校验和
sum2 = (unsigned char)strtoul(str+len+1,NULL,16); //得到最后的校验和
return (sum1 == sum2)?1:0;
}
/*********************************************************************************************************
** Function name: GPSAnalyse
** Descriptions: 分析GPS接收到的数据,并且存储到全局变量里面
** input parameters: 无
** Returned value: None
** Used global variables: None
** Calling modules: None
** Created by: XieLuWei
** Created Date: 2007/07/24
**-------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void GPSAnalyse(void)
{
uint8 i,j,err,temp8;
uint16 temp16;
uint16 length;
char *temptr;
while(1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -