GPS数据包解析V1.0

本文介绍了作者对STM32单片机GPRMC最小定位信息的解析过程,包括数据结构和在串口中断服务程序中逐位解析GPS数据包的方法,以及展示了V1.0版本代码的改进,重点在于简化代码和提高定位信息的准确性。
摘要由CSDN通过智能技术生成

前言

        本人去年刚接触单片机的时候写出的代码V1.0,有许多不足的地方(不能确定是GPRMC最小定位信息;不能确定是无效定位;代码较为繁杂),敬请指教。

        后续将会更新V2.0。

一、GPRMC 最小定位信息

数据详解:$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>,<12>*hh
<1> UTC 时间,hhmmss(时分秒)格式
<2> 定位状态,A=有效定位,V=无效定位
<3>纬度ddmm.mmmm(度分)格式
<4> 纬度半球N(北半球)或S(南半球)
<5>经度dddmm.mmmm(度分)格式
<6> 经度半球E(东经)或W(西经)
<7>地面速率(000.0~999.9节,前面的0也将被传输)
<8>地面航向(000.0~359.9度,以真北为参考基准,前面的0也将被传输)
<9> UTC 日期,ddmmyy(日月年)格式
<10>磁偏角(000.0~180.0度,前面的0也将被传输)
<11> 磁偏角方向,E(东)或W(西)
<12>模式指示(A=自主定位,D=差分,E=估算,N=数据无效)
 

                     
二、代码原理阐述

串口中断代码中边接收数据位边解析数据位。

GPRMC 最小定位信息12个信息段之间用,相隔开,在串口中断里用,作为改变Currnt_State标志位的依据。

$用作GPS数据包的开始位,*用作GPS数据包的停止位。

三、效果展示


 

四、代码(main.c与bsp_usart.c)

main.c

#include "stm32f10x.h"
#include "bsp_usart.h"

extern char c_3_buf[256]; extern uint8_t c_3_length;
extern uint8_t d_4_buf[]; extern uint8_t d_4_length;	
extern char e_5_buf[256]; extern uint8_t e_5_length;
extern uint8_t f_6_buf[]; extern uint8_t f_6_length;


u8 i_3;
u8 i_5;

void Analytic_latitude_and_longitude()
{
			printf("\r\n纬度为:");			
//			length = sizeof(c_3_buf) / sizeof(c_3_buf[0]);
			for (i_3 = 0; i_3 < c_3_length; i_3++) 
				{
					printf("%c", c_3_buf[i_3]);
				}
				
			printf("\r\n纬度半球为:");		
			printf("%c", d_4_buf[0]);
				
			printf("\r\n经度为:");	
			for (i_5 = 0; i_5 < e_5_length; i_5++) 
				{
					printf("%c", e_5_buf[i_5]);
				}	
				
			printf("\r\n经度半球为:");		
			printf("%c", f_6_buf[0]);	
}

void Reset_parameter()
{
	c_3_length = 0;	
	d_4_length = 0;
	e_5_length = 0;	
	f_6_length = 0;	
	
	flag = 0;
}

int main(void)
{	
  /*初始化USART 配置模式为 115200 8-N-1,中断接收*/
  USART_Config();
	
	/* 发送一个字符串 */
	Usart_SendString( DEBUG_USARTx,"这是一个串口中断接收回显实验\r\n");
	printf("欢迎使用野火STM32开发板\r\n");
	
  while(1)
	{	
		if(flag == 1)//发送信息
		{
			Analytic_latitude_and_longitude();  //解析数据并打印
			Reset_parameter();									//数据复位
		}
		else // 
		{

		}		
	}	
}


          

bsp_usart.c

#include "bsp_usart.h"

int8_t Currnt_State = -6;
uint8_t system_state_flag = 0;
uint8_t flag = 0;

uint8_t a_1_buf[];uint8_t a_1_length = 0;
uint8_t b_2_buf[];uint8_t b_2_length = 0;
char c_3_buf[256];uint8_t c_3_length = 0;
uint8_t d_4_buf[];uint8_t d_4_length = 0;	
char e_5_buf[256];uint8_t e_5_length = 0;
uint8_t f_6_buf[];uint8_t f_6_length = 0;
uint8_t g_7_buf[];uint8_t g_7_length = 0;
uint8_t h_8_buf[];uint8_t h_8_length = 0;		
uint8_t i_9_buf[];uint8_t i_9_length = 0;
uint8_t j_10_buf[];uint8_t j_10_length = 0;
uint8_t k_11_buf[];uint8_t k_11_length = 0;
uint8_t l_12_buf[];uint8_t l_12_length = 0;	
uint8_t m_13_buf[];uint8_t m_13_length = 0;

void USART1_IRQHandler(void)              //串口1中断服务程序
{
	uint8_t Rx_char;	
	
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断
		{
			Rx_char=USART_ReceiveData(USART1);//(USART1->DR);	//读取接收到的数据
			switch (Currnt_State) 
			{  
				case -6:  
				flag = 0;			
				if(Rx_char == '$') 
				{  
						Currnt_State = -5;  
				}  
				break;  
				
				case -5:  
				if(Rx_char == 'G')  //'5'
				{  
						Currnt_State = -4;  
				}  
				else
				{
					Currnt_State = -6;
				}
				break; 
				
				case -4:  
				if(Rx_char == 'P')  //'5'
				{  
						Currnt_State = -3;  
				}  
				else
				{
					Currnt_State = -6;
				}
				break; 
				
				case -3:  
				if(Rx_char == 'R')  //'5'
				{  
						Currnt_State = -2;  
				}  
				else
				{
					Currnt_State = -6;
				}
				break; 	
				
				case -2:  
				if(Rx_char == 'M')  //'5'
				{  
						Currnt_State = -1;  
				}  
				else
				{
					Currnt_State = -6;
				}
				break; 				
				
				case -1:  
				if(Rx_char == 'C')  //'5'
				{  
						Currnt_State = 0;				
				}  
				else
				{
					Currnt_State = -6;
				}
				break; 					
				
				case 0:  
				if(Rx_char == ',')  //'5'
				{  				
						Currnt_State = 1;  
				}  
				break; 		
				
				case 1:  
				{
					if(Rx_char != ',')
					{	
					
						a_1_buf[a_1_length] = Rx_char;
						a_1_length ++;	
					}
					else
					{
						Currnt_State = 2;												
					}
				}	
				break; 		
				
				case 2:  
				{
					if(Rx_char != ',')
					{	
						b_2_buf[b_2_length] = Rx_char;
						b_2_length ++;	
					}
					else
					{
						Currnt_State = 3;												
					}
				}		
				break; 		
				
				case 3:  
				{
					if(Rx_char != ',')
					{	
//						printf("%c", Rx_char);						
						c_3_buf[c_3_length] = Rx_char;
						c_3_length = c_3_length + 1;	
					}
					else
					{
						Currnt_State = 4;												
					}
				}	
				break; 		
				
				case 4:  
				{
					if(Rx_char != ',')
					{	

						d_4_buf[d_4_length] = Rx_char;
						d_4_length ++;	
					}
					else
					{
						Currnt_State = 5;												
					}
				}	
				break; 		


				case 5:  
				{
					if(Rx_char != ',')
					{	
//						printf("%c", Rx_char);							
						e_5_buf[e_5_length] = Rx_char;
						e_5_length = e_5_length + 1;	
					}
					else
					{
						Currnt_State = 6;												
					}
				}	
				break; 		
				
				case 6:  
				{
					if(Rx_char != ',')
					{							
						f_6_buf[f_6_length] = Rx_char;
						f_6_length ++;	
					}
					else
					{
						Currnt_State = 7;												
					}
				}		
				break; 		
				
				case 7:  
				{
					if(Rx_char != ',')
					{	
						g_7_buf[g_7_length] = Rx_char;
						g_7_length ++;	
					}
					else
					{
						Currnt_State = 8;												
					}
				}	
				break; 		
				
				case 8:  
				{
					if(Rx_char != ',')
					{	
						h_8_buf[h_8_length] = Rx_char;
						h_8_length ++;	
					}
					else
					{
						Currnt_State = 9;												
					}
				}	
				break; 		
//
				case 9:  
				{
					if(Rx_char != ',')
					{	
						i_9_buf[i_9_length] = Rx_char;
						i_9_length ++;	
					}
					else
					{
						Currnt_State = 10;												
					}
				}	
				break;
				
				case 10:  
				{
					if(Rx_char != ',')
					{	
						j_10_buf[j_10_length] = Rx_char;
						j_10_length ++;	
					}
					else
					{
						Currnt_State = 11;												
					}
				}		
				break; 		
				
				case 11:  
				{
					if(Rx_char != ',')
					{	
						k_11_buf[k_11_length] = Rx_char;
						k_11_length ++;	
					}
					else
					{
						Currnt_State = 12;												
					}
				}	
				break; 		
				
				case 12:  
				{
					if(Rx_char != '*')
					{	
						l_12_buf[l_12_length] = Rx_char;
						l_12_length ++;	
					}
					else
					{
						Currnt_State = 13;	
						flag = 1;							
					}
				}	
				break; 		
				
				case 13:  
				{				
					
					if(Rx_char != '$')
					{	
						m_13_buf[m_13_length] = Rx_char;
						m_13_length ++;	
					}
					else
					{
						Currnt_State = -5;
						
					}
				}					
				break; 		
					
				
				default:
					break;
			} 
		}
} 

         
 

  • 11
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值