Ajuda: Receber e tratar tramas de GPS

Boas pessoal

Estou com um problema para programar um GPS (PmodGPS da Digilent), não bom programar mas lá me vou desenrascando.
A situação é a seguinte, quando ligo o GPS e depois de ele se ligar ao satélite, recebo 4 tramas identificadas com um $ e com o tipo da trama:

$GPGGA,064951.000,2307.1256,N,12016.4438,E,1,8,0.95,39.9,M,17.8,M,,65
$GPGSV,3,1,09,29,36,029,42,21,46,314,43, 26,44,020,43,15,21,321,39
7D
$GPRMC,064951.000,A,2307.1256,N,12016.4438,E,0.03,165.48,260406,3.05,W,A55
$GPVTG,165.48,T,,M,0.03,N,0.06,K,A
37

O que já pensei fazer identificar a trama que quero, este caso é a $GPRMC, depois de identificar ir virgula a virgula e retirar os valores necessárias para o diferentes dados que preciso mostrar:

Tempo: 064951.000
Lat: 2307.1256,N
Lon: 12016.4438,E
Data: 260406

Como já disse, não sou muito bom programador e primeiro não que tipo de dados vou usar para guardar a trama, mesmo que seja um array, o tamanho não vai ser sempre o mesmo porque quando não está ligado ao satelite a trama vem vazia (ex: $GPRMC,,,,,,,,,,,,), saber como identificar o inicio e o fim da trama, e também ir bostar os valores da trama...

Se alguém souber algum site que possa ajudar ou dar uma luzes no código agradecia!

Isso são comandos NMEA. Pode fazer o parse da mensagem com o comando strtok que é uma função padrão da linguagem C.

Não estou a usar essa biblioteca :S
O professor não quer... está complicado para programar isto...

Por alguma razão não está a fazer o if.

Deixo aqui o código se alguém poder dar uma ideia ou detectar o erro agradecia...

#include <SoftwareSerial.h>
#define rxGPS 10
#define txGPS 11

SoftwareSerial serialGPS(rxGPS,txGPS); //RX = 10, TX = 11

char recebe_trama[125]; // supostamente o array para a trama
int flag = 0;
int n=0;

void setup() {
  // put your setup code here, to run once:
  pinMode(rxGPS, INPUT);
  pinMode(txGPS, OUTPUT);
  
  serialGPS.begin(9600);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  if(serialGPS.available()){
    while(serialGPS.available()){ //recebe dados
      recebe_trama[n++] = serialGPS.read();
      if(n == 125)break;
    }
                  
    if(flag == 0){
       //verifica se recebeu a trama $GPRMC
         if( recebe_trama[0x00]=='

&& recebe_trama[0x01]=='G' && recebe_trama[0x02]=='P' && recebe_trama[0x03]=='R' && recebe_trama[0x04]=='M' && recebe_trama[0x05]=='C'){
             flag = 1;
        }
   }
       
        if (flag== 1){
       imprime_trama();  
        } else{
         flag = 0;
        }
 }
}

void imprime_trama(){
        Serial.write(recebe_trama,n);
        n=0;
}

Estas a assumir que o primeiro caractere e o $ isto muito provavelmente nao sera verdade.

Deves, antes de comecar a guardar as letras ver se a letra e um $ ou nao... se nao for, deixa o caractere passar ate chegar.

Se o professor nao deixa usar a strtok e deixa usar as bibliotecas do Arduino, algo de errado se passa na cabeca dele. Provavelmente aprendes mais a escrever um driver serie do que a fazer parsing de strings num microcontrolador.

Tens varios if's no teu codigo... qual deles nao funciona?
Porque usas notacao hexadecimal nos vectores?? Algum fetiche?

O que e que isto faz??

         if (flag== 1){
        imprime_trama();  
         } else{
          flag = 0;
         }

Se a flag for igual a um, imprime trama. Se a trama nao for igual a um ( ou seja, zero), atribuis o valor zero de novo a variavel flag.