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

📄 gps.c

📁 使用CYAN单片机的ECOG1开发板连接SIM300C的GSM模块开发的短信收发程序.供UART和AT指令编程者参考
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************
MODE:		AML--#GPS+accelerator+compass
MCU:		Cyan eCOG1k
COMPILER:	CyanIDE v1.41
FILE NAME:	GPS C source code files
******************************************************************************/

#define gps_code

/******************************************************************************
Project level include files.
******************************************************************************/

#include "gps.h"
#include "cyan_base_driver.h"

extern char			receive_temp_buf[20];
extern unsigned int	receive_p;
/******************************************************************************
Declaration of static functions.
******************************************************************************/
int __irq_code _str_cmp(char *str1,char *str2);
void gps_initialization(void);
void __irq_code RMC_receive(void);
void __irq_code GGA_receive(void);
void __irq_code GSA_receive(void);
void __irq_code GSV_receive(void);
void __irq_code GPS_one_group_receive(void);
void __irq_code GPS_STR_head_receive(void);

void __irq_code GPS_data_transmit(void);
void __irq_code GPS_transmit_one_byte(char *transmit_P);

/******************************************************************************
NAME
    _str_cmp

SYNOPSIS
    int __irq_code _str_cmp(char *str1,char *str2)

FUNCTION
    Be invoked for interrupt function.
    Compares the string pointed to by str1 to the string pointed to by str2.
	Returns an integer 0(equal) or 1(not equal).

RETURNS
    0 or 1.
******************************************************************************/
int __irq_code _str_cmp(char *str1,char *str2)
{
	int cmp_value = 0;
	while((*str1 != '\0') || (*str2 != '\0'))
	{
		if(*str1 != *str2) break;
		else
		{		
			str1++;
			str2++;
		}
	}
	if((*str1 == '\0') && (*str2 == '\0')) cmp_value = 0;
	else cmp_value = 1;
	return(cmp_value);
}



/******************************************************************************
NAME
    usr_rx_handler

SYNOPSIS
    void __irq_entry usr_rx_handler(void)

FUNCTION
    Interrupt handler for usr receive ready
    Receive one byte data from GPS mode.

RETURNS
    Nothing.
******************************************************************************/

void __irq_entry usr_rx_handler(void)
{
	
	int test = fd.duart.a_sts.rx_1b_rdy;		// Read rx interrupt status register
	
	test += fd.duart.a_sts.rx_act;				// Ensure that the receiver is currently inactive.
	if (1 == test)								// Received character ready?
	{
		c = rg.duart.a_rx;					// Yes, read receive register
		if(c >= '\x80') goto usr_rx_handler_end;// If Receive value isn't ASCII,abandon current value.
		
		switch(c)								// Judge receive value.
		{
			case '$' :							// Receive value equ $?
				checksum = 0;					// Start count checksum;
				receive_buffer_count = 0;		// CLR receive character counter.
				str_head_flag = _GPHAD_;
				break;
			
			case CR:												// Receive value equ ENTER?
				
			case LF:												// Receive value equ line advance?
				
				break;
				
			default:												// Other value 
				checksum ^= c;										// Count checksum.
				
				switch(str_head_flag)
				{
					case _GPHAD_:
						GPS_STR_head_receive();
						break;
					
					case _GPGGA_:
						GGA_receive();
						break;
						
					case _GPGSA_:
						GSA_receive();
						break;
						
					case _GPGSV_:
						GSV_receive();
						break;
						
					case _GPRMC_:
						RMC_receive();
						break;
						
					
					default:
						break;
				}
				break;	
		}
		
	}
usr_rx_handler_end:
	nop();
}

/******************************************************************************
NAME
    usr_ex_handler

SYNOPSIS
    void __irq_entry usr_ex_handler(void)

FUNCTION
    Interrupt handler for usr exceptions

RETURNS
    Nothing.
******************************************************************************/

void __irq_entry usr_ex_handler(void)
{
	// Clear any exceptions
    rg.duart.a_int_clr = 0xfff2;
	// Disable any exceptions
    rg.duart.a_int_dis = 0xfff2;
}


/******************************************************************************
NAME
    gps_initialization

SYNOPSIS
    void gps_initialization(void)

FUNCTION
    Display gps fix character.

RETURNS
    Nothing.
******************************************************************************/
void gps_initialization(void)
{
	char *P;
	int i;
	P = "$GPGSA,";
	for(i = 0;i < 7;i++)
	{
		GPGSA.head[i] = *P;
		P++;
	}
	
	P = "$GPGGA,";
	for(i = 0;i < 7;i++)
	{
		GPGGA.head[i] = *P;
		P++;
	}
	
	P = "$GPRMC,";
	for(i = 0;i < 7;i++)
	{
		GPRMC.head[i] = *P;
		P++;
	}
	
	P = "$GPGSV,";
	for(i = 0;i < 7;i++)
	{
		GPGSV1.head[i] = *P;
		P++;
	}
	
	P = "$GPGSV,";
	for(i = 0;i < 7;i++)
	{
		GPGSV2.head[i] = *P;
		P++;
	}
	
	P = "$GPGSV,";
	for(i = 0;i < 7;i++)
	{
		GPGSV3.head[i] = *P;
		P++;
	}
	
	P = "$GPGSV,";
	for(i = 0;i < 7;i++)
	{
		GPGSV4.head[i] = *P;
		P++;
	}
	GPGSA.CR_LF[0] = CR;
	GPGSA.CR_LF[1] = LF;
	
	GPGGA.CR_LF[0] = CR;
	GPGGA.CR_LF[1] = LF;
	
	GPRMC.CR_LF[0] = CR;
	GPRMC.CR_LF[1] = LF;
	
	GPGSV1.CR_LF[0] = CR;
	GPGSV1.CR_LF[1] = LF;
	
	GPGSV2.CR_LF[0] = CR;
	GPGSV2.CR_LF[1] = LF;
	
	GPGSV3.CR_LF[0] = CR;
	GPGSV3.CR_LF[1] = LF;
	
	GPGSV4.CR_LF[0] = CR;
	GPGSV4.CR_LF[1] = LF;
	
	GPS_TX_ready_flag = 0;
	receive_buffer_count = 0;
	receive_flag = 0;
	gps_state = '0';
	GPS_TX_gradation_flag = 0;
	GPS_TX_count = 0;
	_GSV_TX_sum_ = 0;
	
	GPGGA_TX_pointer = (char *)(&GPGGA);
	GPGSA_TX_pointer = (char *)(&GPGSA);
	GPGSV1_TX_pointer = (char *)(&GPGSV1);
	GPGSV2_TX_pointer = (char *)(&GPGSV2);
	GPGSV3_TX_pointer = (char *)(&GPGSV3);
	GPGSV4_TX_pointer = (char *)(&GPGSV4);
	GPRMC_TX_pointer = (char *)(&GPRMC);
	    
}   
    
/******************************************************************************
NAME
    display_gps_data

SYNOPSIS
    void display_gps_data(void)

FUNCTION
    Display gps data.

RETURNS
    Nothing.
******************************************************************************/

/******************************************************************************
end
******************************************************************************/

void __irq_code RMC_receive(void)
{
	switch(receive_flag)
	{
		case RMC_TIME:									// Receive UTC time character.
			if(c != ',')
			{
				GPRMC.UTC_timer[receive_buffer_count] = c;
				receive_buffer_count++;
				if(receive_buffer_count == 10)
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GPRMC.UTC_timer[receive_buffer_count] = ',';
				while(receive_buffer_count < (10 - 1))
				{
					receive_buffer_count ++;
					GPRMC.UTC_timer[receive_buffer_count] = ' ';
					
				}
				
				receive_buffer_count = 0;
				receive_flag = RMC_WORK_STATE;
			}
			break;
			
			
		case RMC_WORK_STATE:									// Receive UTC time character.
			if(c != ',')
			{
				GPRMC.work_state[receive_buffer_count] = c;
				receive_buffer_count++;
				if(receive_buffer_count == 2)
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GPRMC.work_state[receive_buffer_count] = ',';
				while(receive_buffer_count < (2 - 1))
				{
					receive_buffer_count ++;
					GPRMC.work_state[receive_buffer_count] = ' ';
					
				}
				
				receive_buffer_count = 0;
				receive_flag = RMC_LATITUDE;
			}
			break;
		
		case RMC_LATITUDE :								// Receive latitude character.
			if(c != ',')
			{
				GPRMC.latitude[receive_buffer_count] = c;
				receive_buffer_count++;
				if(receive_buffer_count == 10)
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GPRMC.latitude[receive_buffer_count] = ',';
				while(receive_buffer_count < (10 - 1))
				{
					receive_buffer_count ++;
					GPRMC.latitude[receive_buffer_count] = ' ';
					
				}
				
				receive_buffer_count = 0;
				receive_flag = RMC_LATITUDE_ASPECT;
			}
			break;
			
		
		case RMC_LATITUDE_ASPECT:						// Receive latitude aspect character.
			if(c != ',')
			{
				GPRMC.latitude_aspect[receive_buffer_count] = c;
				receive_buffer_count++;
				if(receive_buffer_count == 2)
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GPRMC.latitude_aspect[receive_buffer_count] = ',';
				while(receive_buffer_count < (2 - 1))
				{
					receive_buffer_count ++;
					GPRMC.latitude_aspect[receive_buffer_count] = ' ';
					
				}
				
				receive_buffer_count = 0;
				receive_flag = RMC_LONGITUDE;
			}
			break;
		
		
		case RMC_LONGITUDE:								// Receive longitude character.
			if(c != ',')
			{
				GPRMC.longitude[receive_buffer_count] = c;
				receive_buffer_count++;
				if(receive_buffer_count == 11)
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GPRMC.longitude[receive_buffer_count] = ',';
				while(receive_buffer_count < (11 - 1))
				{
					receive_buffer_count ++;
					GPRMC.longitude[receive_buffer_count] = ' ';
					
				}
				
				receive_buffer_count = 0;
				receive_flag = RMC_LONGITUDE_ASPECT;
			}
			break;
		
		
		case RMC_LONGITUDE_ASPECT:						// Receive longitude aspect character.
			if(c != ',')
			{
				GPRMC.longitude_aspect[receive_buffer_count] = c;
				receive_buffer_count++;
				if(receive_buffer_count == 2)
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GPRMC.longitude_aspect[receive_buffer_count] = ',';
				while(receive_buffer_count < (2 - 1))
				{
					receive_buffer_count ++;
					GPRMC.longitude_aspect[receive_buffer_count] = ' ';
					
				}
				
				receive_buffer_count = 0;
				receive_flag = RMC_SPEED;
			}
			break;
			
		
		
		case RMC_SPEED:									// Receive speed character.
			if(c != ',')
			{
				GPRMC.speed[receive_buffer_count] = c;
				receive_buffer_count++;
				if(receive_buffer_count == 6)
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GPRMC.speed[receive_buffer_count] = ',';
				while(receive_buffer_count < (6 - 1))
				{
					receive_buffer_count ++;
					GPRMC.speed[receive_buffer_count] = ' ';
					
				}
				
				receive_buffer_count = 0;
				receive_flag = RMC_ASPECT;
			}
			break;
		
		case RMC_ASPECT:									//Not receive aspect character.
			if(c != ',')
			{
				GPRMC.bearing_pointer[receive_buffer_count] = c;
				receive_buffer_count++;
				if(receive_buffer_count == 6)
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GPRMC.bearing_pointer[receive_buffer_count] = ',';
				while(receive_buffer_count < (6 - 1))
				{
					receive_buffer_count ++;
					GPRMC.bearing_pointer[receive_buffer_count] = ' ';
					
				}
				
				receive_buffer_count = 0;
				receive_flag = RMC_DATE;
			}
			break;	
			
			
		case RMC_DATE:									// Receive UTC date character.
			if(c != ',')
			{
				GPRMC.UTC_date[receive_buffer_count] = c;
				receive_buffer_count++;
				if(receive_buffer_count == 7)
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GPRMC.UTC_date[receive_buffer_count] = ',';
				while(receive_buffer_count < (7 - 1))
				{
					receive_buffer_count ++;
					GPRMC.UTC_date[receive_buffer_count] = ' ';
					
				}
				
				receive_buffer_count = 0;
				receive_flag = RMC_SUN_DATA1;
			}
			break;
			
			
		case RMC_SUN_DATA1:									// Receive UTC date character.
			if(c != ',')
			{
				GPRMC.sun_data1[receive_buffer_count] = c;
				receive_buffer_count++;
				if(receive_buffer_count == 6)
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GPRMC.sun_data1[receive_buffer_count] = ',';
				while(receive_buffer_count < (6 - 1))
				{
					receive_buffer_count ++;
					GPRMC.sun_data1[receive_buffer_count] = ' ';
					
				}
				
				receive_buffer_count = 0;
				receive_flag = RMC_SUN_DATA2;
			}
			break;
			
		case RMC_SUN_DATA2:									// Receive UTC date character.
		
			if(c != '*')
			{
				GPRMC.sun_data2[receive_buffer_count] = c;
				if((++receive_buffer_count) > (4 - 1))
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GPRMC.end_flag = '*';
				
				c2 = checksum & 0x0f; c1 = ((checksum >> 4) & 0x0f);	// Change checksum to ASCII.
				if (c1 < 10) c1+= '0'; else c1 += 'A' - 10;
				if (c2 < 10) c2+= '0'; else c2 += 'A' - 10;
				
				while(receive_buffer_count < (4 - 1))
				{
					receive_buffer_count ++;
					GPRMC.sun_data2[receive_buffer_count] = ' ';
				}
				
				receive_flag = RMC_CHECKSUM;
				receive_buffer_count = 0;
			}
			break;
			
		case RMC_CHECKSUM:									// Receive UTC date character.
			
				GPRMC.checksum[receive_buffer_count] = c;
				if(receive_buffer_count++ >= 1)
				{
					if((c1 == GPRMC.checksum[0]) && (c2 == GPRMC.checksum[1]))
					{
						

⌨️ 快捷键说明

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