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

📄 drv_gps.c

📁 uCOS2 for 51系列
💻 C
📖 第 1 页 / 共 2 页
字号:
** 函数名称: GPS_NMEA_GSA_Interpreter
** 功能描述: GPS NMEA格式RMC包解释函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年1月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/ 

 		void	GPS_NMEA_GSA_Interpreter(INT8U rx,INT8U *prx_counter)		reentrant
{
}
/*********************************************************************************************************
** 函数名称: GPS_NMEA_ASV_Interpreter
** 功能描述: GPS NMEA格式RMC包解释函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年1月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/ 

 		void	GPS_NMEA_ASV_Interpreter(INT8U rx,INT8U *prx_counter)		reentrant
{
}
/*********************************************************************************************************
** 函数名称: GPS_NMEA_TypeCheck
** 功能描述: GPS NMEA格式类型检查函数
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年1月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/ 

		INT8U	GPS_MOTO_TypeCheck(INT8U rx,INT8U *prx_counter)		reentrant
{
	INT8U	cnt;
	static	INT8U	type_flag;
	INT8U	i;
	INT8U	flag;

	cnt = *prx_counter - GPS_MOTO_TYPE_SEG_OFFSET;

	if(!cnt)
		type_flag = 0xFF;
	else if(cnt > 5)
	{
		*prx_counter = 0;
		return 0;
	}
	flag = 0x01;
	
	checksum ^= rx;

	if(!cnt)
	{
		for(i=0;i<8;flag<<=1,i++)
		{
		 	if(rx != GPS_MOTO_Type[i][cnt])
				type_flag &= (~flag);
		}
	}
	else
	{
		for(i=0;i<8;flag<<=1,i++)
		{
		 	if(rx != GPS_MOTO_Type[i][1])
				type_flag &= (~flag);
		}

		flag = 0x01;

		if(type_flag)
		{
			for(i=0;i<8;flag<<=1,i++)
			{
				if(type_flag & flag)
					return	i+1;	
			}
		}	
		else
			*prx_counter = 0;
	}
	return 0;			
}
/*********************************************************************************************************
** 函数名称: Task_GPS_Interpreter       
** 功能描述: GPS包处理函数
** 输 入: void *pData
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 龚树强
** 日 期: 2005年1月3日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/  
		void Task_GPS_Interpreter(void *pData) 			reentrant
{                           
	static 	INT8U	rx_counter = 0;
	static	INT8U	gps_pack_format = NULL;
	static	INT8U	gps_pack_type	= NULL;
	INT8U	rx;
	INT8U	*ptr;
	INT8U	err;
	
#if OS_CRITICAL_METHOD == 3                      /* Allocate storage for CPU status register           */
    OS_CPU_SR  cpu_sr;



    cpu_sr = 0;                                  /* Prevent compiler warning                           */
#endif
    
	
	do
	{                   
		ptr = (INT8U *)OSQPend(GPS_RX_Q,0,&err);
		rx = *(ptr+POINTER_LENGTH);
		Memery_Release(ptr,&err);
		rx_counter = 0;
		gps_pack_format = NULL;
		gps_pack_type = NULL;
			

		switch(rx)
		{
			case	'$'	:	gps_pack_format = GPS_NMEA_FORMAT;
							checksum = 0;
							break;
			case	'@'	:	gps_pack_format = GPS_MOTO_FORMAT;
							break;
			default		:	break;
		}

		do
		{
			ptr = (INT8U *)OSQPend(GPS_RX_Q,0/*OS_TICKS_PER_SEC/2*/,&err);
			rx = *(ptr+POINTER_LENGTH);
			Memery_Release(ptr,&err);

			if(err == OS_NO_ERR)
			{
				rx_counter ++;

				if(gps_pack_format == GPS_NMEA_FORMAT)
				{
					if(!gps_pack_type)
					{	
						gps_pack_type = GPS_NMEA_TypeCheck(rx,&rx_counter);
						if(gps_pack_type)
							current_state = GPS_NMEA_TYPE_SEG;
					}
					else
					{
						if((rx == ASCII_CR)||(rx == ASCII_LF))
						{
							seg_offset = 0;
							checksum = 0;
							current_state = GPS_NMEA_TYPE_SEG;

							OSTaskResume(TASK_GPS_PRIO);
						}
						else
						{
							switch(gps_pack_type)
							{
								case	GPS_NMEA_GLL	:  	GPS_NMEA_GLL_Interpreter(rx,&rx_counter);
															break;
								case	GPS_NMEA_GGA	:  	GPS_NMEA_GAA_Interpreter(rx,&rx_counter);
															break;
								case	GPS_NMEA_VTG	:  	GPS_NMEA_VTG_Interpreter(rx,&rx_counter);
															break;
								case	GPS_NMEA_RMC	:  	GPS_NMEA_RMC_Interpreter(rx,&rx_counter);
															break;
								case	GPS_NMEA_GSA	:  	GPS_NMEA_GSA_Interpreter(rx,&rx_counter);
															break;
								case	GPS_NMEA_ASV	:  	GPS_NMEA_ASV_Interpreter(rx,&rx_counter);
															break;
								default					:	break;
							}
						}
					}
				}
				else if(gps_pack_format == GPS_MOTO_FORMAT)
				{
					if(rx_counter>= GPS_MOTO_TYPE_SEG_OFFSET)
					{
						if(!gps_pack_type)
						{	
							gps_pack_type = GPS_MOTO_TypeCheck(rx,&rx_counter);
							if(gps_pack_type)
								current_state = GPS_MOTO_TYPE_SEG;
						}
						else
						{
							if((rx == ASCII_CR)||(rx == ASCII_LF))
							{
								seg_offset = 0;
								checksum = 0;
								current_state = GPS_NMEA_TYPE_SEG;

								OSTaskResume(TASK_GPS_PRIO);
							}
							else
							{
								switch(gps_pack_type)
								{
									case	GPS_MOTO_Ea		:  	GPS_MOTO_Ea_Interpreter(rx,&rx_counter);
																break;
									default					:	break;
								}
							}
						}
				   	}
				}
			}
			else if(err == OS_TIMEOUT)
			{
			 	rx_counter = 0;
			}
		}
		while(rx_counter);
	}while(1);
	
	return;
}


/*********************************************************************************************************
                            End Of File
**********************************************************************************************************/

⌨️ 快捷键说明

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