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

📄 gps.c

📁 SmartARM2400系列开发板全套资料
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************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 + -