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

📄 gps.c.bak

📁 使用CYAN单片机的ECOG1开发板连接SIM300C的GSM模块开发的短信收发程序.供UART和AT指令编程者参考
💻 BAK
📖 第 1 页 / 共 2 页
字号:
					else
					{
						
					}
					receive_buffer_count = 0;
					GPRMC.CR_LF[0] = CR;
					GPRMC.CR_LF[1] = LF;
					receive_flag = RMC_OTHER;
					GPS_RECEIVE_DONE_FLAG = 1;
				}
			break;

		default: 
			//receive_buffer_count = 0;
			break;
		
	}
}



void __irq_code GGA_receive(void)
{
	switch(receive_flag)
	{
		case GGA_TIME:									// Receive UTC time character.
			GPS_data_buf = (char *)(&GPGGA.UTC_timer);
			data_length = 10;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GGA_LATITUDE;
				group_receive_done_flag = 0;
			}
			break;
			
		case GGA_LATITUDE:
			
			GPS_data_buf = (char *)(&GPGGA.latitude);
			data_length = 10;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GGA_LATITUDE_ASPECT;
				group_receive_done_flag = 0;
			}
			break;
			
		case GGA_LATITUDE_ASPECT:
		
			GPS_data_buf = (char *)(&GPGGA.latitude_aspect);
			data_length = 2;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GGA_LONGITUDE;
				group_receive_done_flag = 0;
			}
			break;
			
		case GGA_LONGITUDE:
		
			GPS_data_buf = (char *)(&GPGGA.longitude);
			data_length = 11;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GGA_LONGITUDE_ASPECT;
				group_receive_done_flag = 0;
			}
			break;
		
		case GGA_LONGITUDE_ASPECT:
			GPS_data_buf = (char *)(&GPGGA.longitude_aspect);
			data_length = 2;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GGA_QUALITY;
				group_receive_done_flag = 0;
			}
			break;
			
		case GGA_QUALITY:
			GPS_data_buf = (char *)(&GPGGA.quality);
			data_length = 2;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GGA_STAR_SUM;
				group_receive_done_flag = 0;
			}
			break;
						
		case GGA_STAR_SUM:
			GPS_data_buf = (char *)(&GPGGA.star_sum);
			data_length = 3;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GGA_LEVEL_PRECISION;
				group_receive_done_flag = 0;
			}
			break;
		
		case GGA_LEVEL_PRECISION:
			GPS_data_buf = (char *)(&GPGGA.level_precision);
			data_length = 5;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GGA_ANTENNA_HEIGHT;
				group_receive_done_flag = 0;
			}
			break;
			
		case GGA_ANTENNA_HEIGHT:
			GPS_data_buf = (char *)(&GPGGA.antenna_height);
			data_length = 9;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GGA_AH_UNIT;
				group_receive_done_flag = 0;
			}
			break;
		
		case GGA_AH_UNIT:
			GPS_data_buf = (char *)(&GPGGA.AH_unit);
			data_length = 2;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GGA_EARTH_HEIGHT;
				group_receive_done_flag = 0;
			}
			break;
			
		case GGA_EARTH_HEIGHT:
			GPS_data_buf = (char *)(&GPGGA.earth_height);
			data_length = 7;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GGA_EH_UNIT;
				group_receive_done_flag = 0;
			}
			break;
			
		case GGA_EH_UNIT:
			GPS_data_buf = (char *)(&GPGGA.EH_unit);
			data_length = 2;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GGA_UN_USE1;
				group_receive_done_flag = 0;
			}
			break;
			
		case GGA_UN_USE1:
			
			if(c != '*')
			{
				GPGGA.un_use1[receive_buffer_count] = c;
				if((++receive_buffer_count) > (5 - 1))
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GPGGA.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 < (5 - 1))
				{
					receive_buffer_count ++;
					GPGGA.un_use1[receive_buffer_count] = ' ';
				}
				
				receive_flag = GGA_CHECKSUM;
				receive_buffer_count = 0;
				group_receive_done_flag = 0;
			}
			break;
		
		case GGA_CHECKSUM:									// Receive UTC date character.
			
				GPGGA.checksum[receive_buffer_count] = c;
				if(receive_buffer_count++ >= 1)
				{
					if((c1 == GPGGA.checksum[0]) && (c2 == GPGGA.checksum[1]))
					{
						
					}
					else
					{
						
					}
					receive_buffer_count = 0;
					GPGGA.CR_LF[0] = CR;
					GPGGA.CR_LF[1] = LF;
					receive_flag = GGA_OTHER;
				}
			break;
		
		default: 
			break;
		
	}
}


void __irq_code GSA_receive(void)
{
	switch(receive_flag)
	{
		case GSA_MODE:									// Receive UTC time character.
			GPS_data_buf = (char *)(&GPGSA.wrok_mode);
			data_length = 2;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GSA_STATE;
				group_receive_done_flag = 0;
			}
			break;
			
		case GSA_STATE:
			GPS_data_buf = (char *)(&GPGSA.position_MSG);
			data_length = 2;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GSA_UN_USE;
				group_receive_done_flag = 0;
			}
			break;
			
		case GSA_UN_USE:
			if(c != '*')
			{
				GPGSA.un_use[receive_buffer_count] = c;
				if((++receive_buffer_count) > (GSA_UN_USE_LENGTH - 1))
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GPGSA.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 < (GSA_UN_USE_LENGTH - 1))
				{
					receive_buffer_count ++;
					GPGSA.un_use[receive_buffer_count] = ' ';
				}
				
				receive_flag = GSA_CHECKSUM;
				receive_buffer_count = 0;
			}
			break;
		
		case GSA_CHECKSUM:									// Receive UTC date character.
			
				GPGSA.checksum[receive_buffer_count] = c;
				receive_buffer_count++;
				if(receive_buffer_count > 2)
				{
					if((c1 == GPGSA.checksum[0]) && (c2 == GPGSA.checksum[1]))
					{
						
					}
					else
					{
						
					}
					receive_buffer_count = 0;
					GPGSA.CR_LF[0] = CR;
					GPGSA.CR_LF[1] = LF;
					receive_flag = GSA_OTHER;
				}
			break;
			
		default: 
			break;
	}
}

void __irq_code GSV_receive(void)
{
	switch(receive_flag)
	{
		case GSV_SUM:									// Receive UTC time character.
			GPS_data_buf = (char *)(&_GSV_sum_);
			data_length = 2;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				receive_flag = GSV_ITEM;
				group_receive_done_flag = 0;
			}
			break;
			
		case GSV_ITEM:
			GPS_data_buf = (char *)(&_GSV_item_);
			data_length = 2;
			GPS_one_group_receive();
			if(group_receive_done_flag)
			{
				switch(_GSV_item_[0])
				{
					case '1':
						GSV_pointer = &GPGSV1;
						break;
					
					case '2':
						GSV_pointer = &GPGSV2;
						break;
					
					case '3':
						GSV_pointer = &GPGSV3;
						break;
					
					case '4':
						GSV_pointer = &GPGSV4;
						break;
					
					default: 
						//GSV_pointer = 0;
						break;
				}
				GSV_pointer->GSV_sum[0] = _GSV_sum_[0];
				GSV_pointer->GSV_sum[1] = _GSV_sum_[1];
				GSV_pointer->GSV_item[0] = _GSV_item_[0];
				GSV_pointer->GSV_item[1] = _GSV_item_[1];
				
				receive_flag = GSV_UN_USE;
				group_receive_done_flag = 0;
			}
			break;
			
		case GSV_UN_USE:
			
			if(c != '*')
			{
				GSV_pointer->un_use[receive_buffer_count] = c;
				receive_buffer_count++;				
				if(receive_buffer_count > (GSV_UN_USE_LENGTH - 1))
				{
					receive_buffer_count--;
				}
			}
			else
			{
				GSV_pointer->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 < (GSV_UN_USE_LENGTH - 1))
				{
					receive_buffer_count ++;
					GSV_pointer->un_use[receive_buffer_count] = ' ';
			
				}
				
				receive_flag = GSV_CHECKSUM;
				receive_buffer_count = 0;
			}
			break;
		
		case GSV_CHECKSUM:									// Receive UTC date character.
			
				GSV_pointer->checksum[receive_buffer_count] = c;
				if(receive_buffer_count++ >= 1)
				{
					if((c1 == GSV_pointer->checksum[0]) && (c2 == GSV_pointer->checksum[1]))
					{
						
					}
					else
					{
						
					}
					receive_buffer_count = 0;
					receive_flag = GSV_OTHER;
					GSV_pointer->CR_LF[0] = CR;
					GSV_pointer->CR_LF[1] = LF;
				}
			break;
			
		default: break;	
	}
}

void __irq_code GPS_one_group_receive(void)
{
	if(c != ',')
	{
		*(GPS_data_buf + (receive_buffer_count++)) = c;
		
		if(receive_buffer_count > (data_length - 1))
		{
			receive_buffer_count--;
		}
	}
	else
	{
		GPS_data_buf[receive_buffer_count] = ',';
		while(receive_buffer_count < (data_length - 1))
		{
			receive_buffer_count ++;
			GPS_data_buf[receive_buffer_count] = ' ';
			
		}
		group_receive_done_flag = 1;
		receive_buffer_count = 0;
	}
}

void __irq_code GPS_STR_head_receive(void)
{
	if(c != ',')
	{
		string_head_buf[receive_buffer_count] = c;
		receive_buffer_count++;
	}
	else 														// Receive string head complete
	{
		string_head_buf[receive_buffer_count] = 0;
		if( _str_cmp( &string_head_buf[0],"GPGSA" ) == 0 )		//Compare whith GPGSA string,equ????
		{
			receive_flag = GSA_MODE;							//Yes,receive GPS state.
			str_head_flag = _GPGSA_;							//Setting string head flag to GPGSA.
		}
		else													//NO,Compare whith GPRMC,
		{
			if( _str_cmp( &string_head_buf[0],"GPRMC" ) == 0 )	//Receive character equal GPRMC???
			{
				receive_flag = RMC_TIME;						//Yes,receive UTC time.
				str_head_flag = _GPRMC_;						//Setting string head flag to GPRMC.
			}
			else												//No,
			{
				if( _str_cmp( &string_head_buf[0],"GPGGA" ) == 0 )	//Receive character equal GPRMC???
				{
					str_head_flag = _GPGGA_;
					receive_flag = GGA_TIME;
				}
				else
				{
					if(_str_cmp( &string_head_buf[0],"GPGSV" ) == 0 )
					{
						str_head_flag = _GPGSV_;
						receive_flag = GSV_SUM;
					}
					else
					{
						//receive_flag = OTHER;							//Not receive anything.
						str_head_flag = _OTHER_;
					}
				}
			}									
		}
		receive_buffer_count = 0;								//Reset receive counter.
	}
}



void __irq_code GPS_data_transmit(void)
{
	
	if(GPS_TX_ready_flag)
	{
		switch(GPS_TX_gradation_flag)
		{
			case 1:
				GPS_transmit_one_byte(GPGGA_TX_pointer);
				break;
			
			case 2:
				GPS_transmit_one_byte(GPGSA_TX_pointer);
				break;
			
			case 3:
				
				if(_GSV_TX_sum_ < '1')
				{
					GPS_TX_count = 0;
					GPS_TX_gradation_flag++;
				}
				else
				{
					GPS_transmit_one_byte(GPGSV1_TX_pointer);
				}
				break;
			
			case 4:
				
				if(_GSV_TX_sum_ < '2')
				{
					GPS_TX_count = 0;
					GPS_TX_gradation_flag++;
				}
				else
				{
					GPS_transmit_one_byte(GPGSV2_TX_pointer);
				}
				break;
				
			case 5:
				
				if(_GSV_TX_sum_ < '3')
				{
					GPS_TX_count = 0;
					GPS_TX_gradation_flag ++;
				}
				else
				{
					GPS_transmit_one_byte(GPGSV3_TX_pointer);
				}
				break;
				
			case 6:
				if(_GSV_TX_sum_ < '4')
				{
					GPS_TX_count = 0;
					GPS_TX_gradation_flag++;
				}
				else
				{
					GPS_transmit_one_byte(GPGSV4_TX_pointer);
				}
				break;
				
			case 7:
				GPS_transmit_one_byte(GPRMC_TX_pointer);
				break;
				
			default: 
				GPS_TX_ready_flag = 0;
				GPS_TX_count = 0;

				break;
		}
	}
}

void __irq_code GPS_transmit_one_byte(char *transmit_P)
{
	char GPS_TX_temp = *(transmit_P + GPS_TX_count);
	
	if(GPS_TX_temp != '\n')
	{
		if((GPS_TX_temp != ' ') && (GPS_TX_temp != 0))
		{
			rg.duart.b_tx8 = GPS_TX_temp;
		}
		GPS_TX_count++;	
	}
	else
	{
		GPS_TX_count = 0;
		GPS_TX_gradation_flag++;
		rg.duart.b_tx8 = '\n';
	}
}


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

⌨️ 快捷键说明

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