void UART1_RT_STATE(uint8_t u8InChar)
{
uint8_tTempBuf[3]= {0};
uint8_tCheckSum = 0;
switch(x_RecvState)
{
case WaitingForHeads:
if(u8InChar == '$')
{
UART1_Rx_buff[0] = u8InChar;
x_RecvState = WaitingForG;
}
else
{
x_RecvState = WaitingForHeads;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
}
break;
case WaitingForG:
if(u8InChar == 'G')
{
UART1_Rx_buff[1] = u8InChar;
x_RecvState = WaitingForN;
}
else
{
x_RecvState = WaitingForHeads;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
}
break;
case WaitingForN:
if(u8InChar == 'N')
{
UART1_Rx_buff[2] = u8InChar;
x_RecvState = WaitingForG_R;
}
else
{
x_RecvState = WaitingForHeads;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
}
break;
case WaitingForG_R:
if(u8InChar == 'G')
{
UART1_Rx_buff[3] = u8InChar;
x_RecvState = WaitingForG_2;
}
else if(u8InChar == 'R')
{
UART1_Rx_buff[3] = u8InChar;
x_RecvState = WaitingForM;
}
else
{
x_RecvState = WaitingForHeads;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
}
break;
case WaitingForG_2:
if(u8InChar == 'G')
{
UART1_Rx_buff[4] = u8InChar;
x_RecvState = WaitingForA;
}
else
{
x_RecvState = WaitingForHeads;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
}
break;
case WaitingForM:
if(u8InChar == 'M')
{
UART1_Rx_buff[4] = u8InChar;
x_RecvState = WaitingForC;
}
else
{
x_RecvState = WaitingForHeads;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
}
break;
case WaitingForC:
if(u8InChar == 'C')
{
UART1_Rx_buff[5] = u8InChar;
x_RecvState = WaitingForRs;
rcv_count = 6;
gps_flag = RMC;
}
else
{
x_RecvState = WaitingForHeads;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
}
break;
case WaitingForA:
if(u8InChar == 'A')
{
UART1_Rx_buff[5] = u8InChar;
x_RecvState = WaitingForGs;
rcv_count = 6;
gps_flag = GGA;
}
else
{
x_RecvState = WaitingForHeads;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
}
break;
case WaitingForRs:
if(u8InChar != '*')
{
UART1_Rx_buff[rcv_count++] = u8InChar;
if(rcv_count > 65)
{
x_RecvState = WaitingForHeads;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
}
else
x_RecvState = WaitingForRs;
}
else
{
if(rcv_count != 65)
{
if(rcv_count == 37)
{
gps_flag = NOUSE;
DATA_ANY = 1;
}
x_RecvState = WaitingForHeads;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
}
else
{
UART1_Rx_buff[rcv_count++] = u8InChar;
x_RecvState = WaitingForChsum_1;
}
}
break;
case WaitingForGs:
if(u8InChar != '*')
{
UART1_Rx_buff[rcv_count++] = u8InChar;
if(rcv_count > 68)
{
x_RecvState = WaitingForHeads;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
}
else
x_RecvState = WaitingForGs;
}
else
{
if(rcv_count != 68)
{
if(rcv_count == 36)
{
gps_flag = NOUSE;
DATA_ANY = 1;
}
x_RecvState = WaitingForHeads;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
}
else
{
UART1_Rx_buff[rcv_count++] = u8InChar;
x_RecvState = WaitingForChsum_1;
}
}
break;
case WaitingForChsum_1:
//printf("gf = %d\n",gps_flag);
UART1_Rx_buff[rcv_count++] = u8InChar;
x_RecvState = WaitingForChsum_2;
break;
case WaitingForChsum_2:
TempBuf[0]= UART1_Rx_buff[rcv_count-1];
TempBuf[1]=u8InChar;
TempBuf[2]=0;
CheckSum=strtoul(TempBuf,NULL,16);
UART1_Rx_buff[rcv_count++] = u8InChar;
Checkret = GpsChecksum(CheckSum);
x_RecvState = WaitingForEnd_1;
break;
case WaitingForEnd_1:
if(u8InChar == 0xD)
{
UART1_Rx_buff[rcv_count++] = u8InChar;
x_RecvState = WaitingForHeads;
if(Checkret)
{
#if 0
if(gps_flag == GGA)
P13 = 1;
if(gps_flag == RMC)
P13 = 0;
#endif
memcpy(UART1_Pr_buff,UART1_Rx_buff,rcv_count);
Checkret = 0;
DATA_ANY = 1;
}
}
x_RecvState = WaitingForHeads;
rcv_count = 0;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
break;
default:
rcv_count = 0;
x_RecvState = WaitingForHeads;
memset(UART1_Rx_buff,0,sizeof(UART1_Rx_buff));
break;
}
}