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);
}
}
}