前言
本人去年刚接触单片机的时候写出的代码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;
}
}
}