精品国产一区在线_av无码中文字幕无码王_天海翼三点刺激高潮不停_好硬好大好爽视频_欧美高清一区三区在线专区_香蕉黄色片

  • 回復(fù)
  • 收藏
  • 點(diǎn)贊
  • 分享
  • 發(fā)新帖

GPS模塊(NMEA-0183協(xié)議)數(shù)據(jù)讀取

NMEA-0183協(xié)議內(nèi)容請(qǐng)百度資訊搜索。下面程序需要根據(jù)需要讀取的數(shù)據(jù)做相應(yīng)修改
/*
  @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();
  }
} 
全部回復(fù)(1)
正序查看
倒序查看
2021-08-10 19:04

#ifndef __MYNMEA_H

#define __MYNMEA_H

#include "stdint.h"

#include <string.h>

 #include <stdlib.h>

typedef enum{ 

GPNON   = 0x00, 

GPGGA   = 0x01,  

GPGSA   = 0x02, 

GPGSV   = 0x04,   

GPRMC   = 0x08, 

GPVTG   = 0x10  

}nmeaPACKTYPE;

typedef struct{

char       status;  /**< 定位狀態(tài),A=有效定位,V=無(wú)效定位*/

uint16_t   speed;   /**地面速率(0000.0~1851.8公里/小時(shí),前面的0也將被傳輸)*/

}nmeaINFO;

//需要獲取的信息//********************************************//********************************************//********************************************

#define RX_BUF_SIZE         10   //UART接收緩存大小//********************************************

#define UART_RX_Flag        0x01 //staFlag[0]:UART是否接收到新的數(shù)據(jù)

#define GET_CHECKSUM_OK     0X02 //staFlag[1]:是否已經(jīng)計(jì)算出檢驗(yàn)和

#define GET_CHECKSUM_ENABLE 0X04 //staFlag[2]:是否使能校驗(yàn)和計(jì)算//********************************************

typedef struct{

  uint8_t       staFlag;              //狀態(tài)標(biāo)志便變量 

uint8_t       checkStaFlag;         // 

uint8_t       checkSum[2];   

uint8_t       num; 

char          rxDatNew;            //當(dāng)前串口接受到的數(shù)據(jù)    

char          rxBuf[RX_BUF_SIZE];  //UART接收緩存數(shù)組:存放接收到的速度數(shù)據(jù) 

uint8_t       pBuf;                 //BUF指針角標(biāo) 

uint8_t       rxNum;                // 

nmeaPACKTYPE  nmeaPackType;

}NMEA_Typedef;

//************************************************

extern NMEA_Typedef nmeaTypedef;

void NmeaRx(void);

void NmeaDataDeal(void);

#endif //__MYNMEA_H

0
回復(fù)
發(fā)
主站蜘蛛池模板: 吻狼之问题女孩国语在线观看 | 二区三区四区 | www.成色av久久成人 | 激情欧美成人久久综合 | 91视频你懂得 | 日韩一级免费观看 | 亚洲日韩中文字幕在线播放 | 欧美80老妇毛片 | 黄色真人毛片 | 国产亚洲精品区 | 在线岛国av | 五月天激情在线麻豆 | 毛片软件大全 | 午夜一区二区三区在线观看 | 字幕日韩视频一区二区 | 国产成人自产拍免费视频 | 豪放女大兵免费播放在线观看 | 国产成人高清亚洲明星一区 | 欧美又黄又嫩大片a级 | 四虎伊人| av久久网站| 天堂av手机在线观看 | 亚洲综合九九 | 人人射人人射 | 精品999视频 | 激情国产视频 | 美女乱子伦高潮在线观看完整片 | 91三级电影 | 国产欧美性成人精品午夜 | 日韩美香港a一级毛片免费 奇米影视欧美 | 韩国一级特黄大片视频看看 | 六月伊人| 国产精品禁18久久久夂久 | 婷婷久久综合九色综合97最多收藏 | 亚洲成人一区二区三区 | 久久久精品成人免费视频 | 青草草在线观看免费视频 | 九一国产在线观看 | 亚洲欧美日韩高清 | 好湿好紧太硬了我太爽了视频 | 在线bt天堂网www在线 |