Go Down

Topic: Duvida Serial mega e gm862 (Read 492 times) previous topic - next topic

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

Code: [Select]
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

Go Up