Programa no sale de una funcion.

Buenas noches comunidad, les realizo una consulta capas bastante tonta, pero no logro hacerla andar.

El siguiente codigo recibe un msj, lo lee, lo separa y lo guarda en la eeprom. Cuando mando un mensaje lo procesa perfectamente, pero si mando otro sea con el comando ATC o ATA, no lo lee, solamante lo lee (o se ve por el monitor serie) si le doy un reset al arduino, es como si una ves que entra a cualquier de las dos funciones no se ejecuta mas el loop o no regresa.

Les dejo el codigo principal y las dos funciones ... Desde ya muchas gracias.

Programa principal:

#include <EEPROM.h>
#include <Separador.h>
#include <Sim800l.h>
#include <SoftwareSerial.h>
Sim800l Sim800l;
Separador S;

String textSms, numberSms;
bool error;

////////////////////////////////// Estructura para agendar administradores (Max 3 usuarios) ///////////////////

struct Administradores
{ String aDnumero1 ;
  String aDnumero2 ;
  String aDnumero3 ;

} ;

////////////////////////////////// Estructura para agendar avisos (Max 5 usuarios) ////////////////////////////

struct Avisos
{ String aVnumero1 ;
  String aVnumero2 ;
  String aVnumero3 ;
  String aVnumero4 ;
  String aVnumero5 ;

} ;

////////////////////////////////// ////////////////////////////////// ////////////////////////////////// //////


void setup() {



  Serial.begin(9600);
  Sim800l.begin();
  Sim800l.reset();

  error = Sim800l.delAllSms();

}

void loop() {

  textSms = Sim800l.readSms(1);

  if (textSms.indexOf("OK") != -1)
  {

    if (textSms.length() > 7)
    {

      numberSms = Sim800l.getNumberSms(1);

      textSms.toUpperCase();

      if (textSms.indexOf("ATC") != -1) {
        Serial.println("Se recibio el comando para agregar administradores");
        agenAdm();

      }
      else if (textSms.indexOf("ATA") != -1) {
        Serial.println("Se recibio el comando para agregar numeros de avisos");
        agenAvi();

      }
      else {
        Serial.println("Comando no compatible");

      }
      Sim800l.delAllSms();
    }
  }
}

Función de Administradores:

void agenAdm() {

  String datosRecibidos =  Sim800l.readSms(1);

  String elemento1 = S.separa(datosRecibidos, ',', 5);
  String elemento2 = S.separa(datosRecibidos, ',', 6);
  String elemento3 = S.separa(datosRecibidos, ',', 7);

  Serial.println("Numero 1 recibido: " + elemento1);
  Serial.println("Numero 2 recibido: " + elemento2);
  Serial.println("Numero 3 recibido: " + elemento3);

  Administradores datosVar;
  {
    Administradores Datos ;
    datosVar.aDnumero1 = elemento1 ;
    datosVar.aDnumero2 = elemento2 ;
    datosVar.aDnumero3 = elemento3 ;
  };

  Serial.print("Esto se grabara en numero 1: "); Serial.print(datosVar.aDnumero1) ;
  Serial.println("");
  Serial.print("Esto se grabara en numero 2: "); Serial.print(datosVar.aDnumero2) ;
  Serial.println("");
  Serial.print("Esto se grabara en numero 3: "); Serial.print(datosVar.aDnumero3) ;
  Serial.println("");
  int eeAddress = 0;

  EEPROM.put(eeAddress, datosVar);
  Serial.println("Se han guardado los numeros!\n");

  delay(5000);
  Serial.println("Ahora leo la agenda!");
  eeAddress = 0;

  Administradores leoDatos;
  EEPROM.get(eeAddress, leoDatos);

  Serial.println("Agenda de administradores:\n");
  Serial.print("Numero 1:");  Serial.println(leoDatos.aDnumero1);
  Serial.print("Numero 2:");  Serial.println(leoDatos.aDnumero2);
  Serial.print("Numero 3:");  Serial.println(leoDatos.aDnumero3);

  Sim800l.delAllSms();


}

Función para avisos:

void agenAvi() {

  String datosRecibidos =  Sim800l.readSms(1);

  String elemento1 = S.separa(datosRecibidos, ',', 5);
  String elemento2 = S.separa(datosRecibidos, ',', 6);
  String elemento3 = S.separa(datosRecibidos, ',', 7);
  String elemento4 = S.separa(datosRecibidos, ',', 8);
  String elemento5 = S.separa(datosRecibidos, ',', 9);

  Serial.println("Numero 1 recibido: " + elemento1);
  Serial.println("Numero 2 recibido: " + elemento2);
  Serial.println("Numero 3 recibido: " + elemento3);
  Serial.println("Numero 4 recibido: " + elemento4);
  Serial.println("Numero 5 recibido: " + elemento5);

  Avisos datosVar;
  {
    Avisos Datos ;
    datosVar.aVnumero1 = elemento1 ;
    datosVar.aVnumero2 = elemento2 ;
    datosVar.aVnumero3 = elemento3 ;
    datosVar.aVnumero4 = elemento4 ;
    datosVar.aVnumero5 = elemento5 ;
  };

  Serial.print("Esto se grabara en numero 1: "); Serial.print(datosVar.aVnumero1) ;
  Serial.println("");
  Serial.print("Esto se grabara en numero 2: "); Serial.print(datosVar.aVnumero2) ;
  Serial.println("");
  Serial.print("Esto se grabara en numero 3: "); Serial.print(datosVar.aVnumero3) ;
  Serial.println("");
  Serial.print("Esto se grabara en numero 4: "); Serial.print(datosVar.aVnumero4) ;
  Serial.println("");
  Serial.print("Esto se grabara en numero 5: "); Serial.print(datosVar.aVnumero5) ;
  Serial.println("");
  int eeAddress = 45;

  EEPROM.put(eeAddress, datosVar);
  Serial.println("Se han guardado los numeros!\n");

  delay(5000);
  Serial.println("Ahora leo la agenda!");
  eeAddress = 45;

  Avisos leoDatos;
  EEPROM.get(eeAddress, leoDatos);

  Serial.println("Agenda de administradores:\n");
  Serial.print("Numero 1:");  Serial.println(leoDatos.aVnumero1);
  Serial.print("Numero 2:");  Serial.println(leoDatos.aVnumero2);
  Serial.print("Numero 3:");  Serial.println(leoDatos.aVnumero3);
  Serial.print("Numero 4:");  Serial.println(leoDatos.aVnumero4);
  Serial.print("Numero 5:");  Serial.println(leoDatos.aVnumero5);

  Sim800l.delAllSms();


}

Puedes poner la secuencia de salida por monitor serie cuando envias el primer mensaje y cuando envias el segundo.
Me hace ruido tu comando al final que dice

Sim800l.delAllSms();

procesas un dato recibido y luego borras SMSs okay.

Que pasa entonces cuando recibes dos si le estas dando la orden de borrar el 2do? No lo termino de ver del todo en este momento pero esa es la duda que me genera el programa.
Si lo tuviera delante, haría algunas pruebas para comprender como esta funcionando.

Hola surbyte, gracias por la repuesta, te comento que igual me pasa aunque mande un msj, el cual lo reconoce y lo procesa, pero por ejemplo puedo mandar inmediatamente otro o puedo esperar unos minutos que hace exactamente lo mismo. Para darme cuenta si el loop funciona agrege un Serial.println al inicio del loop, envio el msj lo procesa pero no vuelve el loop le queda al final de los skechts, sea el de avisos o el de administradores, te paso lo que agrege que es una pavada y lo que me devuelve el serial.

void loop() {
 Serial.println("Esta el bucle en funcionamiento a la espera de otro msj"); //Nueva linea para verificar el loop
  textSms = Sim800l.readSms(1);

  if (textSms.indexOf("OK") != -1)

//Continua el codigo tal cual lo agregue anteriormente

Y lo que me devuelve el serial. (El msj enviado es "ata,223456,46546,46534,6456,466" sin las "")​[tt]​[/tt]

Esta el bucle en funcionamiento a la espera de otro msj
Esta el bucle en funcionamiento a la espera de otro msj
Esta el bucle en funcionamiento a la espera de otro msj
Esta el bucle en funcionamiento a la espera de otro msj
Esta el bucle en funcionamiento a la espera de otro msj
Esta el bucle en funcionamiento a la espera de otro msj
Esta el bucle en funcionamiento a la espera de otro msj

113
Se recibio el comando para agregar numeros de avisos
Numero 1 recibido: 223456
Numero 2 recibido: 46546
Numero 3 recibido: 46534
Numero 4 recibido: 6456
Numero 5 recibido: 466

OK

Esto se grabara en numero 1: 223456
Esto se grabara en numero 2: 46546
Esto se grabara en numero 3: 46534
Esto se grabara en numero 4: 6456
Esto se grabara en numero 5: 466

OK

Se han guardado los numeros!

Ahora leo la agenda!
Agenda de administradores:

Numero 1:223456
Numero 2:46546
Numero 3:46534
Numero 4:6456
Numero 5:466
OK

De echo tengo abierto el serial desde hace 10min y jamas volvio al loop.

Te dejo los comandos de la libreria del ReadSms y delAllSms, ubicados en el .cpp de SIM800L por si el problema viene por hay.

////Codigo ReadSms////

String Sim800l::readSms(uint8_t index){
  SIM.print (F("AT+CMGF=1\r")); 
  if (( _readSerial().indexOf("ER")) ==-1) {
    SIM.print (F("AT+CMGR="));
    SIM.print (index);
    SIM.print("\r");
    _buffer=_readSerial();
    if (_buffer.indexOf("CMGR:")!=-1){
      return _buffer;
    }
    else return "";    
    }
  else
    return "";
}
////Codigo delAllSms////

bool Sim800l::delAllSms(){ 
  SIM.print(F("at+cmgda=\"del all\"\n\r"));
  _buffer=_readSerial();
  if (_buffer.indexOf("OK")!=-1) {return true;}else {return false;}
  
}

Desde ya muchas gracias.

Buenas tardes comunidad, haciendo pruebas note que si anulo la funcion de GET me retorna al loop ( tambien anulando la funcion Env() ya que hay tambien hay un GET), no le encuentro la logica porque no vuelve, es como si no se detiene, constantemente esta leyendo.

Quedo asi

void agenAvi() {

  String datosRecibidos =  Sim800l.readSms(1);

  String elemento1 = S.separa(datosRecibidos, ',', 5);
  String elemento2 = S.separa(datosRecibidos, ',', 6);
  String elemento3 = S.separa(datosRecibidos, ',', 7);
  String elemento4 = S.separa(datosRecibidos, ',', 8);
  String elemento5 = S.separa(datosRecibidos, ',', 9);

  Serial.println("Numero 1 recibido: " + elemento1);
  Serial.println("Numero 2 recibido: " + elemento2);
  Serial.println("Numero 3 recibido: " + elemento3);
  Serial.println("Numero 4 recibido: " + elemento4);
  Serial.println("Numero 5 recibido: " + elemento5);

  Avisos datosVar;
  {
    Avisos Datos ;
    datosVar.aVnumero1 = elemento1 ;
    datosVar.aVnumero2 = elemento2 ;
    datosVar.aVnumero3 = elemento3 ;
    datosVar.aVnumero4 = elemento4 ;
    datosVar.aVnumero5 = elemento5 ;
  };

  Serial.print("Esto se grabara en numero 1: "); Serial.print(datosVar.aVnumero1) ;
  Serial.println("");
  Serial.print("Esto se grabara en numero 2: "); Serial.print(datosVar.aVnumero2) ;
  Serial.println("");
  Serial.print("Esto se grabara en numero 3: "); Serial.print(datosVar.aVnumero3) ;
  Serial.println("");
  Serial.print("Esto se grabara en numero 4: "); Serial.print(datosVar.aVnumero4) ;
  Serial.println("");
  Serial.print("Esto se grabara en numero 5: "); Serial.print(datosVar.aVnumero5) ;
  Serial.println("");

  int eeAddress = 45;

  EEPROM.put(eeAddress, datosVar);
  Serial.println("Se han guardado los numeros!\n");

  delay(500);
  Serial.println("Ahora leo la agenda!");
  eeAddress = 45;

  Avisos leoDatos;
 /* EEPROM.get(eeAddress, leoDatos);

  Serial.println("Agenda de avisos:\n");
  Serial.print("Numero 1:");  Serial.println(leoDatos.aVnumero1);
  Serial.print("Numero 2:");  Serial.println(leoDatos.aVnumero2);
  Serial.print("Numero 3:");  Serial.println(leoDatos.aVnumero3);
  Serial.print("Numero 4:");  Serial.println(leoDatos.aVnumero4);
  Serial.print("Numero 5:");  Serial.println(leoDatos.aVnumero5);*/

  Sim800l.delAllSms();

  Env();
}

A su vez agrege una funcion para que me una vez que se agendo el numero me mande un mensaje con una respuesta que tampoco anda, me imprime en el serial el numero y texto correctamente pero no llega nada. Obviamente tuve que llamar de nuevo a la funcion GET para saber a que numero mandarlo, en las pruebas solo le mando un numero no todos. Nose si es la manera correcta para que me responda, osea tomar un String de una estructura en convertirlo en char y colocarlo en la funcion SENDSMS.

La funcion para enviar el msj

char* text;
bool error; 


void Env(){

  
  Serial.begin(9600);
  int eeAddress = 45;
  eeAddress = 45;

  Avisos leoDatos;
  EEPROM.get(eeAddress, leoDatos);
  delay(500);
  Serial.println("Agenda de avisos:\n");
  Serial.print("Numero 1:");  Serial.println(leoDatos.aVnumero1);
  Serial.print("Numero 2:");  Serial.println(leoDatos.aVnumero2);
  Serial.print("Numero 3:");  Serial.println(leoDatos.aVnumero3);
  Serial.print("Numero 4:");  Serial.println(leoDatos.aVnumero4);
  Serial.print("Numero 5:");  Serial.println(leoDatos.aVnumero5);

  
  text="Respuesta de prueba";

char number [leoDatos.aVnumero1.length()+1];
leoDatos.aVnumero1.toCharArray(number, leoDatos.aVnumero1.length());



  Serial.print("Numero mensaje: ");  Serial.print(number);
   Serial.print("");
   Serial.print("Texto mensaje: ");  Serial.print(text);

   
error=Sim800l.sendSms(number,text);

}

La verdad que ya estoy perdido.

Cualquier ayuda me va a servir... Gracias

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.