Duvida Serial mega e gm862

Boa noite pessoal.
eu tenho um arduino mega e um modulo gm862 gps e estou tentando fazer um tracker

Meu problema é que eu só estou conseguindo ler respostas do modulo quando eu mando um comando para ele, eu sei que o modulo esta me mandando mensagens, pois ele faz isso quando recebe uma ligação e em outros momentos.
alguem tem uma ideia de como fazer para ler os comandos no loop? vou colocar o codigo que eu fiz até agora

const int ONOFFPIN = 4;
const int TIMEOUT = 1000;
const int BAUDRATE = 19200;

String resposta = "";
String serialBuffer = "";
String tempoUTC = "";
boolean SIMPronto = false;
boolean GPSPronto = false;
boolean Rastreando = false;

void setup(){
  pinMode(ONOFFPIN, OUTPUT);

  Serial.begin(BAUDRATE);
  Serial3.begin(BAUDRATE);

  if (!sendCommand("AT")){ 
    ligaModulo(); 
  }
  ligaGPS();
}

void loop(){
  byte serialIn = -1;

//aqui nao funciona
  char inChar;
  String buffer = "";
  if (Serial3.available()){
    Serial.println("passou");
    inChar = Serial3.read(); 
    buffer += inChar;
  }
  if (inChar == 13){
    if (buffer.length() > 1){
      Serial.println("\n\n!!!!!!!!!!!!!!!!!!!!!!!!>");
      Serial.println(buffer.length());
      Serial.print(buffer);
      Serial.print("\n<!!!!!!!!!!!!!!!!!!!!!!!!!\n\n");
      buffer = "";
    }
  } // nao fuinciona

  if (Serial.available()){
    serialIn = Serial.read();

    if ((serialIn != 10) && (serialIn != 13)){
      serialBuffer += char(serialIn);
    }
  }

  if (serialIn == 13){
    if (serialBuffer.length() > 1){
      sendCommand(serialBuffer);
    }
    serialBuffer = "";
  }

  if (serialBuffer.length() == 1){
    switch(serialIn){
    case '1':
      if (!sendCommand("AT#SHDN")){
        ligaModulo();
      }
      break;
    case 'g':
      posicaoGPS();
      break;
    case 'r':
      Serial.print("Resposta: ");
      Serial.println(resposta);
      break;
    }
    serialIn = -1;
  }
  if (millis() % 60000 == 0 && !GPSPronto && !Rastreando){
    posicaoGPS();
    delay(1000);
    if (GPSPronto){
      sendCommand("AT$GPSPS=2,1800"); 
    }
  }
}

void ligaModulo() {
  Serial.println("switching on");
  digitalWrite(ONOFFPIN, HIGH);
  delay(2100);
  digitalWrite(ONOFFPIN, LOW); 
  delay(1200);
  Serial.println("done");
}

boolean sendCommand(String command){
  long timeIsOut;
  String buffer = "";
  char inChar;

  Serial3.print(command); 
  Serial3.print('\r'); 

  timeIsOut = millis() + TIMEOUT; 

  buffer = "";
  while (timeIsOut > millis()){
    if (Serial3.available()){
      inChar = Serial3.read(); 
      buffer += inChar;
      timeIsOut = millis() + TIMEOUT;
    }
  }

  if (buffer.length() > 1){ 
    Serial.print("\nResposta: ");
    Serial.println(buffer); 
    Serial.println("--------------");
    resposta = "";
    resposta = getResponse(buffer); 
    if (buffer.endsWith("OK\r\n")){
      return true;
    } 
    else return false;
    buffer = "";
  }
  else {
    Serial.println("Comando: " + command);
    Serial.println("Sem Resposta\n"); 
    return false;
  }
}

String getResponse(String buffer){
  String response = "", substring = "";
  int first = 0, last = 0;

  if (buffer.length() > 0){
    first = buffer.indexOf(": ");
    last = buffer.indexOf("\nOK");
    if (first > 0 && last > 0){
      response = buffer.substring(first+2, last-3);
    }
    else if (last > 0){
      response = buffer.substring(last+1, last+3);
    }
    else if (first > 0){
      last = buffer.length() - 1;
      response = buffer.substring(first+2, last);
    }
    else response = "";

    return response;
  }
}

//----------------------------------------FUNÇÕES DO GPS----------------------------------
void ligaGPS(){
  Serial.println("Iniciando GPS...");  
  sendCommand("AT$GPSP?");

  if (resposta == "0"){
    Serial.println("Ligando GPS...");
    sendCommand("AT$GPSP=1");
    Serial.println("\nGPS Ligado");
  }
  else if (resposta == "1"){
    Serial.println("GPS ja esta ligado");
  }

  sendCommand("AT$GPSS=19200");
  Serial.println("Concluido");
  Serial.println("-------------------------------------------------\n");
}

//Retorna a posição do GPS
void posicaoGPS(){

  sendCommand("AT$GPSP?");
  if (resposta == "1"){
    sendCommand("AT$GPSACP");
  }
  else {
    Serial.println("GPS esta desligado");
    ligaGPS();
    sendCommand("AT$GPSACP");
  }

  if (resposta.length() > 0){
    separarCoordenadas();
  }  
}

void separarCoordenadas(){
  String temp = "";
  String coord[11] = "", lati = "", longi = "";
  char x;
  int pos = 0;
    
  for (int i = 0; i < resposta.length(); i++){
    x = resposta.charAt(i);
    if (x != ','){
      temp += x;
      Serial.print(temp);
    }
    else{
      coord[pos] = temp;
       Serial.println("\n");
       Serial.print(pos);
       Serial.print(": ");
       Serial.println(coord[pos]);
      pos++;
      temp = "";
    }
    if (i == resposta.length()-1){
      coord[pos] = temp;
      Serial.println("\n");
      Serial.print(pos);
      Serial.print(": ");
      Serial.println(coord[pos]);
      temp = "";
      
    }
  }

  lati = coord[1];
  longi = coord[2];

  if (tempoUTC == coord[0]){  
    Serial.println("Nao obteve novo Fix");
  }
  tempoUTC = coord[0];

  Serial.print("Fix: ");
  Serial.println(coord[5]);
  if (coord[5] != "0"){
    GPSPronto == true;

    //Converte Latitude
    lati.replace(".", "");
    String subLati = lati.substring(0,2) + ".";
    lati.replace(lati.substring(0,2), subLati);
    if (lati.endsWith("S")){
      lati = "-" + lati;
      lati.replace("S", "");
    }
    else lati.replace("N", "");
    
    //Converte Longitude
    longi.replace(".", "");
    String subLongi = longi.substring(0,3) + ".";
    longi.replace(longi.substring(0,3), subLongi);
    if (longi.endsWith("W")){
      longi = "-" + longi;
      longi.replace("W", "");
    }
    else lati.replace("E", "");

    Serial.println("-=-=-=-GPS-=-=-=-=-");
      Serial.print("UTC: ");
      Serial.println(coord[0]);
      Serial.print("Latitude: ");
      Serial.println(lati);
      Serial.print("Longitude: ");
      Serial.println(longi);
      Serial.print("HDOP: ");
      Serial.println(coord[3]);
      Serial.print("Altitude: ");
      Serial.println(coord[4]);
      Serial.print("GPS Fix: ");
      Serial.println(coord[5]);
      Serial.print("COG: ");
      Serial.println(coord[6]);
      Serial.print("Velocidade(Km/H): ");
      Serial.println(coord[7]);
      Serial.print("Velocidade(Knots): ");
      Serial.println(coord[8]);
      Serial.print("Data: ");
      Serial.println(coord[9]);
      Serial.print("Num. Satelites em Uso: ");
      Serial.println(coord[10]);
    Serial.println("-=-=-=-GPS-=-=-=-=-");
  }
  else Serial.println("Nao foi pssivel travar a posicao");
}

apaguei umas partes do codigo pq nao coube no post

Resolvi, pelo menos esse problema, eu tava declarando a String dentro do loop e a variavel q recebe o Serial3.read() era um char e estava fazendo a verificação como se fosse int

agora só preciso saber pq ele ta travando quando consigo travar uma posição do gps