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

📄 gps.c

📁 手持式GPS导航系统-源码
💻 C
📖 第 1 页 / 共 2 页
字号:
		}

/*以下为GPS数据解析部分*/
		temp = USART_getchar();
		if(temp == '$')					/*搜寻开头信息*/
		{
			i = 0;
			while(1)					/*截取语句tag*/
			{
				temp = USART_getchar();
				if(temp != ',')			/*tag结尾的','号*/
					data_buffer[i++] = temp;
				else break;
			}
			data_buffer[i] = '\0';		/*添0*/

/***************************** GPGGA 消息 **************************/
			if(strcmp(data_buffer,"GPGGA\0") == 0)
			{
				while(USART_getchar() != ',');	/*忽略时间信息,实际显示时间从GPRMC里获得*/

				/*获得纬度数据 start*/
				i = 3;				/*前两个数据预留用于显示如 'N:'信息*/
				while(1)
				{
					temp = USART_getchar();
					if(temp == ',')	/*结束*/
						break;
					else
					{
						if(i == 5)latitude[i++] = '.';	/*添加'.'*/
						latitude[i++] = temp;
					}	
				}
				latitude[i] = '\0';				/*字符串结束*/

				temp = USART_getchar();
				if(temp != ',')				/*有效数据*/
				{
					latitude[0] = temp;	/*获得北纬还是南纬*/
					//latitude[1] = ':';				/*冒号*/
					temp = USART_getchar();			/*跳过接下来的','号*/
				}
				/*获得纬度数据 end*/

				/*获得经度数据 start*/
				i = 2;				/*前两个数据预留用于显示如 'E:'信息*/
				while(1)
				{
					temp = USART_getchar();
					if(temp == ',')	/*结束*/
						break;
					else
					{
						if(i == 5)longitude[i++] = '.';	/*添加'.'*/
						longitude[i++] = temp;
					}	
				}
				longitude[i] = '\0';				/*字符串结束*/

				temp = USART_getchar();
				if(temp != ',')					/*有效数据*/
				{
					longitude[0] = temp;	/*获得北纬还是南纬*/
					//longitude[1] = ':';				/*冒号*/
					temp = USART_getchar();			/*跳过接下来的','号*/
				}
				/*获得经度数据 end*/

				/*获的质量因子 start*/
				temp = USART_getchar();
				if(temp != ',')						/*有效数据*/
				{
					fix_valid = temp-0x30;			/*转ASCII到实际二进制数据*/
					temp = USART_getchar();			/*跳过接下来的','号*/
				}
				else fix_valid = 0;
				/*获的质量因子 end*/

				/*获得可使用的卫星数 start*/
				temp = USART_getchar();
				if(temp != ',')
				{
					total_statlites_useful[0] = temp;
					total_statlites_useful[1] = USART_getchar();
					total_statlites_useful[2] = '\0';
					temp = USART_getchar();				/*跳过接下来的','号*/
				}
				else
				{
					total_statlites_useful[0] = '0';
					total_statlites_useful[1] = '0';
					total_statlites_useful[2] = '\0';

				}
				/*获得可使用的卫星数 end*/

				while(USART_getchar() != ',');	/*忽略水平定为精度信息*/
			
				/*获得天线高度 start*/
				i = 2;
				//altitude[i++] = 'A';
				//altitude[i++] = ':';
				while(1)
				{
					temp = USART_getchar();
					if(temp == ',')	/*结束*/
						break;
					else
						altitude[i++] = temp;
				}

				temp = USART_getchar();
				if(temp != ',')					/*有效数据*/
				{
					altitude[i++] = temp;	/*获得单位*/
					temp = USART_getchar();			/*跳过接下来的','号*/
				}
				altitude[i] = '\0';				/*字符串结束*/

				/*获得天线高度 end*/

			}

/******************************* GPGSV 消息 *******************************/
			else if(strcmp(data_buffer,"GPGSV\0") == 0)
			{
				/*获得语句条数 start*/
				temp = USART_getchar();
				if(temp != ',')					/*有效数据*/
				{
					total_gpgsv_no = temp - '0';
					temp = USART_getchar();			/*跳过接下来的','号*/
				}
				else total_gpgsv_no = 0;
				/*获得语句条数 end*/

				/*获得当前语句编号 start*/
				temp = USART_getchar();
				if(temp != ',')					/*有效数据*/
				{
					current_gpgsv_index = temp - '0';
					temp = USART_getchar();			/*跳过接下来的','号*/
				}
				else current_gpgsv_index = 1;

				if(current_gpgsv_index == 1)	/*清数据,重新统计*/
				{
					total_statlites_have_signal[0] = '0';
					total_statlites_have_signal[1] = '0';
					total_statlites_have_signal[2] = '\0';
				}
				/*获得当前语句编号 end*/
#if 1
				/*获得可视卫星总数 start*/
				temp = USART_getchar();
				if(temp != ',')
				{
					total_statlites_visable[0] = temp;
					total_statlites_visable[1] = USART_getchar();
					total_statlites_visable[2] = '\0';
					temp = USART_getchar();				/*跳过接下来的','号*/
				}
				else
				{
					total_statlites_visable[0] = '0';
					total_statlites_visable[1] = '0';
					total_statlites_visable[2] = '\0';
				}
				/*获得可视卫星总数 end*/
#else
				while(USART_getchar() != ',');	/*忽略可视卫星总数*/
#endif
				/*获得可视卫星参数 start*/
				for(i=0;i<4;i++)	/*没条语句包含四颗卫星数据*/
				{
					while(USART_getchar() != ',');	/*忽略卫星号*/
					while(USART_getchar() != ',');	/*忽略卫星仰角*/
					while(USART_getchar() != ',');	/*忽略卫星方位*/

					temp = USART_getchar();			/*卫星信噪比*/

					if((temp != ',') && (temp != '*'))
					{
						temp += USART_getchar() - '0';
						if((temp > '0'))	/*不为0代表这个卫星有信号*/
						{
							if(total_statlites_have_signal[1] != '9') 
								total_statlites_have_signal[1] += 1;
							else
							{
								total_statlites_have_signal[0] += 1;
								total_statlites_have_signal[1] = '0';	
							}
						}
						temp = USART_getchar();				/*跳过接下来的','号*/
					}
				}
				/*获得可视卫星参数 end*/
			}

/*********************************  GPRMC 消息 ***********************************/
			else if(strcmp(data_buffer,"GPRMC\0") == 0)	/*从这个信息里获得时间*/
			{
				//debug("found tag GPRMC");
				i = 0;				
				while(1)
				{
					temp = USART_getchar();
					if(temp == ',')	/*结束*/
						break;
					else
					{
						if((i == 2) || (i == 5))time[i++] = ':';	/*添加'.'*/
						time[i++] = temp;
					}	
				}
				time[i] = '\0';				/*字符串结束*/
				need_update = 1;			/*可以更新数据*/
				
				/*查询数据是否有效*/
				temp = USART_getchar();
				if(temp != ',')
				{
					if(temp == 'A')
					{
						gprmc_valid = 1;
					}
					else gprmc_valid =0;
					temp = USART_getchar();
				}
				else gprmc_valid = 0;				

				/*如果有效则继续收集速度和方位角信息*/
				if(gprmc_valid == 1)
				{
					while(USART_getchar() != ',');	/*忽略纬度*/
					while(USART_getchar() != ',');	/*忽略南北*/
					while(USART_getchar() != ',');	/*忽略经度*/
					while(USART_getchar() != ',');	/*忽略东西*/
					
					i = 3;	
					while(1)	/*获得速度信息*/
					{			
						temp = USART_getchar();
						if(temp == ',')break;
						else speed[i++] = temp;
					}
					speed[i++] = ' ';
					speed[i++] = 'M';
					speed[i++] = 'P';
					speed[i++] = 'H';
					speed[i] = '\0';

					i = 7;
					while(1)	/*获得方向信息*/
					{			
						temp = USART_getchar();
						if(temp == ',')break;
						else angle[i++] = temp;
					}
					angle[i++] = '\'';
					angle[i++] = '\0';
				}
				else	/*数据无效时,全部置零*/
				{
					speed[3] = '0';
					speed[4] = '.';
					speed[5] = '0';
					speed[6] = ' ';
					speed[7] = 'M';
					speed[8] = 'P';
					speed[9] = 'H';
					speed[10] = '\0';

					angle[7] = '0';
					angle[8] = '.';
					angle[9] = '0';
					angle[10] = '\'';
					angle[11] = '\0';
				}
			}
		}

	}
	return 0;
}

⌨️ 快捷键说明

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