Go Down

Topic: Duvida Serial mega e gm862 (Read 515 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
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy