ARDUINO解析GPS数据,读取出来GPRMC帧数据

本文介绍了一种基于 ARDUINO MEGA2560 的 GPS 数据读取方法,通过定时器中断的方式实现数据的周期性获取,并详细展示了相关的 C 语言代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

测试板子使用ARDUINO MEGA2560

#include <TimerOne.h>

#define GPSSerial Serial1
#define DebugSerial Serial

const unsigned int bufferLength = 600;
char RxBuffer[bufferLength];
unsigned int ii = 0;

char EER_GPS_Buffer[24] = {"$GPRMC,,V,,,,,,,,,,N*7F"};

struct
{
    unsigned char CMD;
    unsigned int LengthA;
    char fixed[20];
    unsigned char id_length;
    char id[20];
    unsigned char LengthB1;
    unsigned char LengthB2;
    char api_key[50];
} login;

struct
{
    unsigned char CMD;
    unsigned char LengthA;
    unsigned char mark;
    unsigned char type;
    unsigned char LengthB1;
    unsigned char LengthB2;
    char streamA[24];
    char id[20];
    char streamB[27];
    char GPS_Buffer[150];
    char streamC[7];
} Save_Data;

void setup(){
    GPSSerial.begin(9600);
    DebugSerial.begin(9600);


    Timer1.initialize(1000);
    Timer1.attachInterrupt(Timer1_handler);

    DebugSerial.println("setup end!");
}

void loop(){
    DebugSerial.println("loop start!");
    getGPSData();
    DebugSerial.println("loop end!");
}

unsigned long  Time_Cont = 0;
void Timer1_handler(void)
{
    Time_Cont++;
}

void getGPSData(){
    char *GPS_BufferHead, *GPS_BufferTail;

    clrRxBuffer();

    Time_Cont = 0;
    while (Time_Cont < 2000)
    {
        readBuffer();

        if ((GPS_BufferHead = strstr(RxBuffer, "$GPRMC,")) != NULL)
        {
            if ((GPS_BufferTail = strstr(GPS_BufferHead, "\r\n")) != NULL)
            {
                if(GPS_BufferTail > GPS_BufferHead)
                {
                    memcpy(Save_Data.GPS_Buffer, GPS_BufferHead, GPS_BufferTail - GPS_BufferHead);

                    DebugSerial.println("-----1------");
                    DebugSerial.println(Save_Data.GPS_Buffer);
                    break;
                    clrRxBuffer();
                }
            }

        }       
    }
    if(Time_Cont >= 2000)
    {
        memcpy(Save_Data.GPS_Buffer, EER_GPS_Buffer, 24);   //输出错误信息    
    }
    DebugSerial.println("-----2------");
    DebugSerial.println(Save_Data.GPS_Buffer);

    memset(Save_Data.GPS_Buffer, 0, sizeof Save_Data.GPS_Buffer);   //使用后清空数据
    DebugSerial.println("-----3------");
    DebugSerial.println(Save_Data.GPS_Buffer);
    clrRxBuffer();
}

void readBuffer(){
    while (GPSSerial.available())
    {
        RxBuffer[ii++] = GPSSerial.read();
        if (ii == bufferLength)clrRxBuffer();
    }
}

void clrRxBuffer(void)
{
    memset(RxBuffer, 0, bufferLength);      //清空
    ii = 0;
}

转载于:https://www.cnblogs.com/Mysterious/p/5724220.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值