/*
@file:myNmea.c
@說(shuō)明:處理UART接收到的GPS數(shù)據(jù)
*/
#include "myNmea.h"
NMEA_Typedef nmeaTypedef;
nmeaINFO nmeaInfo[2];
uint16_t speedBuf[8];
unsigned char HexChar2Int(char str)
{
unsigned char sCh;
switch(str){
case 'A':case 'a':sCh=10;break;
case 'B':case 'b':sCh=11;break;
case 'C':case 'c':sCh=12;break;
case 'D':case 'd':sCh=13;break;
case 'E':case 'e':sCh=14;break;
case 'F':case 'f':sCh=15;break;
default:
if((str>='0')&&(str<='9'))
{
sCh=str-'0';
}
}
return sCh;
}
unsigned char Str2Hex(char* str,unsigned char size)
{
unsigned char i,datHex=0;
for(i=0;i<size;i++){
datHex|=(HexChar2Int(str[i])<<(4*(size-1-i)));
}
return datHex;
}
/*
@函數(shù):void NmeaRx(nmeaPACKTYPE nmeaPackType)
@形參:nmeaPackType:想要接收的幀數(shù)據(jù)
*/
void NmeaRx(void)
{
if(nmeaTypedef.staFlag&UART_RX_Flag)
{//串口接收到了一個(gè)字符
nmeaTypedef.rxNum++;
nmeaTypedef.staFlag&=~UART_RX_Flag;//清除標(biāo)志狀態(tài)
if((nmeaTypedef.rxDatNew=='.')//小數(shù)點(diǎn)
||(nmeaTypedef.rxDatNew=='-')//負(fù)號(hào)
||((nmeaTypedef.rxDatNew>='0')&&(nmeaTypedef.rxDatNew<='9'))//數(shù)字
||((nmeaTypedef.rxDatNew>='a')&&(nmeaTypedef.rxDatNew<='z'))//小寫(xiě)字母
||((nmeaTypedef.rxDatNew>='A')&&(nmeaTypedef.rxDatNew<='Z')))//大寫(xiě)字母
{
if(nmeaTypedef.pBuf<RX_BUF_SIZE){//緩存未溢出
nmeaTypedef.rxBuf[nmeaTypedef.pBuf++]=nmeaTypedef.rxDatNew;
}
}
else
{//其他特殊符號(hào)
nmeaTypedef.pBuf=0;//清除buf下標(biāo)
if(nmeaTypedef.rxDatNew=='$')
{//幀起始字符
nmeaTypedef.rxNum=0;
nmeaTypedef.num=0;
nmeaTypedef.nmeaPackType=GPNON;//當(dāng)前幀未確定
nmeaTypedef.staFlag|=GET_CHECKSUM_ENABLE;//可以開(kāi)始計(jì)算校驗(yàn)值
nmeaTypedef.staFlag&=~GET_CHECKSUM_OK; //還沒(méi)到獲取接收的校驗(yàn)值的時(shí)候
}
else if(nmeaTypedef.rxDatNew==',')
{//各個(gè)數(shù)據(jù)間隔標(biāo)志:用來(lái)判斷當(dāng)前是第幾個(gè)數(shù)據(jù)
nmeaTypedef.num++;//逗號(hào)計(jì)數(shù)加1
switch(nmeaTypedef.nmeaPackType)
{
case GPNON://當(dāng)前幀未確定:判讀當(dāng)前幀的名字
if(!strcmp(nmeaTypedef.rxBuf,"GNRMC")) nmeaTypedef.nmeaPackType=GPRMC;
else if(!strcmp(nmeaTypedef.rxBuf,"GNVTG"))nmeaTypedef.nmeaPackType=GPVTG;
else{//不是想要的數(shù)據(jù)
nmeaTypedef.rxNum=0;
nmeaTypedef.num=0;
}
break;
case GPRMC://根據(jù)逗號(hào)個(gè)數(shù)獲取GPRMC相應(yīng)的數(shù)據(jù)
if(nmeaTypedef.num==3)
{//獲取模塊定位狀態(tài)
nmeaInfo[0].status=nmeaTypedef.rxBuf[0];
}
break;
case GPVTG:
if(nmeaTypedef.num==8)
{//獲取地面速度
nmeaInfo[0].speed=atoi(nmeaTypedef.rxBuf);
}
break;
default:;
}
}
else if(nmeaTypedef.rxDatNew=='*')
{//校驗(yàn)和計(jì)算結(jié)束:下面兩個(gè)字符未結(jié)束的校驗(yàn)數(shù)據(jù)
nmeaTypedef.staFlag|= GET_CHECKSUM_OK;
nmeaTypedef.staFlag&=~GET_CHECKSUM_ENABLE;//校驗(yàn)值計(jì)算結(jié)束
}
else if((nmeaTypedef.rxDatNew=='\n')
||(nmeaTypedef.rxDatNew=='\r'))
{//換行符:一幀數(shù)據(jù)結(jié)束
nmeaTypedef.num=0;
nmeaTypedef.rxNum=0;
if(nmeaTypedef.staFlag&GET_CHECKSUM_OK){
nmeaTypedef.staFlag&=~GET_CHECKSUM_OK;
nmeaTypedef.checkSum[1]=Str2Hex(nmeaTypedef.rxBuf,2);
if(nmeaTypedef.checkSum[1]==nmeaTypedef.checkSum[0])
{//數(shù)據(jù)正確(校驗(yàn)值比對(duì)正確)
switch(nmeaTypedef.nmeaPackType){
case GPGGA:nmeaTypedef.checkStaFlag|=GPGGA;break;
case GPGSA:nmeaTypedef.checkStaFlag|=GPGSA;break;
case GPGSV:nmeaTypedef.checkStaFlag|=GPGSV;break;
case GPRMC:nmeaTypedef.checkStaFlag|=GPRMC;break;
case GPVTG:nmeaTypedef.checkStaFlag|=GPVTG;break;
default:;
}
}
else{
switch(nmeaTypedef.nmeaPackType){
case GPGGA:nmeaTypedef.checkStaFlag&=~GPGGA;break;
case GPGSA:nmeaTypedef.checkStaFlag&=~GPGSA;break;
case GPGSV:nmeaTypedef.checkStaFlag&=~GPGSV;break;
case GPRMC:nmeaTypedef.checkStaFlag&=~GPRMC;break;
case GPVTG:nmeaTypedef.checkStaFlag&=~GPVTG;break;
default:;
}
}
nmeaTypedef.nmeaPackType=GPNON;
}
}
memset(nmeaTypedef.rxBuf,0,sizeof(nmeaTypedef.rxBuf));//buf清除
}
//***************************************************
if((nmeaTypedef.staFlag&GET_CHECKSUM_ENABLE)&&nmeaTypedef.rxNum)
{//計(jì)算'$'和'*'之間的所有字符的異或值
if(nmeaTypedef.rxNum==1)nmeaTypedef.checkSum[0]=nmeaTypedef.rxDatNew;
else nmeaTypedef.checkSum[0]^=nmeaTypedef.rxDatNew;
}
}
}
uint16_t speedBuf[8];
void NmeaDataDeal(void)//數(shù)據(jù)濾波處理
{
static uint8_t i=0,j=0;
static uint16_t sum=0;
if(nmeaTypedef.checkStaFlag&GPVTG)
{//GPVTG 的值收到并且校驗(yàn)正確了
nmeaTypedef.checkStaFlag&=~GPVTG;
i++;
if(i>=8)i=0;
if(j<8)j++;
sum-=speedBuf[i];
speedBuf[i]=nmeaInfo[0].speed;
sum+=speedBuf[i];
nmeaInfo[1].speed=sum/j;
}
if(nmeaTypedef.checkStaFlag&GPRMC)
{//GPRMC 的值收到并且校驗(yàn)正確了
nmeaTypedef.checkStaFlag&=~GPRMC;
nmeaInfo[1].status= nmeaInfo[0].status;
}
}
/**************************************
**函數(shù) :__interrupt void UART1_R_RXNE_IRQHandler(void)
**功能 :串口1接收中斷入口
**形參 :無(wú)
**返回值:無(wú)
*************************************/
#pragma vector= UART1_R_RXNE_vector
__interrupt void UART1_R_RXNE_IRQHandler(void)
{//接收數(shù)據(jù)中斷
if(UART1_SR_RXNE)
{//讀數(shù)據(jù)寄存器非空
UART1_SR_RXNE=0;
nmeaTypedef.rxDatNew=UART1_DR; //接收到的數(shù)據(jù)
nmeaTypedef.staFlag|=UART_RX_Flag; //置位標(biāo)志
NmeaRx();
}
}