基于stm32的GPS解析

http://www.amobbs.com/thread-5247828-1-1.html

 

 

 

楼主的解析方式很好,采用了,再补充一个环形队列吧,方式就是采用hotpower 的uart 零耗时思想,上代码:
typedef struct

{
    uint8_t GPS_data_Count;
    uint8_t Frame;
    uint64_t
pd;
    uint64_t pd1;
    uint8_t GPS_Buffer[256];
    uint8_t *pstr; 
            //测试
}Gps_data_addr_st;

Gps_data_addr_st
Gps_data_addr;

//中断

void UART0_IRQHandler(void)
{
   
uint8_t u8InChar=0xFF;
    static uint8_t KeyWord_Count;
    uint32_t
u32_IQR= UART0->ISR;
    uint32_t u32_status = UART0->FSR;
   
UART0->ISR = u32_IQR;
    //串口接收数据
    if (((_UART_IS_RX_READY(UART0)
> 0) || (_UART_IS_RX_TIMEOUT(UART0) > 0)) &&
(_UART_IS_RX_BUF_ERR(UART0) == 0))
    {
    
   while(_UART_IS_RX_EMPTY(UART0) == 0)
        {
          
 __disable_irq();
            _UART_RECEIVEBYTE(UART0, u8InChar);
       
    Gps_data_addr.GPS_Buffer[Gps_data_addr.GPS_data_Count] = u8InChar;       

            switch(u8InChar)
            {   //NEMA0183
格式数据以$开始,\r\n结尾(0x0d 0x0a)
                case '$':
                
   Gps_data_addr.pd <<= 8;
                    Gps_data_addr.pd |=
'$';//存放'$'
                    Gps_data_addr.pd <<= 8;
          
         Gps_data_addr.pd |= Gps_data_addr.GPS_data_Count;//'$'在数组中的下标
    
               KeyWord_Count = Gps_data_addr.GPS_data_Count;
               
break;
                case 0x0D:
                    Gps_data_addr.pd
<<= 8;
                    Gps_data_addr.pd |= 0x0d;//存放0x0d
       
            Gps_data_addr.pd <<= 8;
                
   Gps_data_addr.pd |= Gps_data_addr.GPS_data_Count;0x0d在数组中的下标
       
            //收完一帧数据,发送GPS解码消息,5us后任务就绪
                
   //模拟抢占式任务,串口中断退出后解码可以开始,优先级等同TMR0中断,解码时间必须在14ms内完成
                    if(
(Gps_data_addr.GPS_Buffer[KeyWord_Count+5] == 'C') ||      //GPRMC
          
             (Gps_data_addr.GPS_Buffer[KeyWord_Count+5] == 'A') ||    
 //GPGSA
                        (Gps_data_addr.GPS_Buffer[KeyWord_Count+5]
== 'V') ||      //GPGSV
                      
 (Gps_data_addr.GPS_Buffer[KeyWord_Count+5] == 'L') )       //GPGLL
       
            {
                        GPS_Decode_Run();//启动TMR1中断
       
            }
                    else
                    {
          
             Gps_data_addr.pd = 0;
                    }
               
break;
                default:    break;
            }
          
 __enable_irq();       
            Gps_data_addr.GPS_data_Count++;
    
   }
    }
    else
    {//串口BUFFER数据溢出处理
    
   while(_UART_IS_RX_EMPTY(UART0) == 0)
        {
          
 _UART_FLUSH_FIFO(UART0, UART_FCR_TFR_Msk | UART_FCR_RFR_Msk);
          
 _UART_RECEIVEBYTE(UART0, u8InChar);
        }  
    }
}

转载于:https://www.cnblogs.com/tureno/articles/3385400.html

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值