Problema en Peticiones HTTP con comandos AT (Módulo SIM808)

Hola comunidad, buen día, solicito de su ayuda ya que tengo más de un mes intentando enviar petición HTTP a una API a través de un módulo SIM808 utilizando los comandos AT. Lo eh intentado de manera directa (es decir, ingreso los comandos desde el Monitor Serial que tiene por comunicación PC-Arduino y todo funciona correctamente, tanto peticiones GET como POST), pero cuando intento automatizar el proceso para que ejecute los comandos al realizar una venta y mande los datos a la API, sufre algo que no comprendo, al momento de mandar el comando de AT+HTTPPARA="URL","miAPI..." no escribe correctamente el comando y por lo tanto no conecta con la api, y en ocasiones me resetea el código que incluso me vuelve a ejecutar el void setup().

Si alguien pudiera apoyarme con esto, de antemano estaría muy agradecido. Comparto el código para mejor comprensión y una imagen del resultado.

tengo partido el proyecto en 3 archivos.ino

Main.ino

unsigned long miliPrevioGaspar = 0;
unsigned long miliActualoGaspar = 0;
const long intervaloGaspar = 10;
unsigned long miliPrevioGPS = 0;
unsigned long miliActualoGPS = 0;
const long intervaloGPS = 10000;

String url = "http://mi.api.net:8025/controlador/ard"; // esta api no existe, solo por privacidad la cambio.

#include <ArduinoJson.h>
String json;

String latitudGuardada = "-1.0";
String longitudGuardada = "-1.0";
String datosEnGET;
String datosThingSpeakGET;

/* *************** VARIABLES DEL GASPAR *************** */
  int i = 0;
  char delimitador[] = "\r";
  char *strtok(char *datos, const char *delimitador);
  char *resultado = NULL;
  //Clave-Valor
  char *valores = NULL;
  char delimitadorV[] = ":";
  char delimitadorEspacio[] = " ";
  int cv;
  String dataValores[12];

/* *************** VARIABLES DEL GPS *************** */
#include <TinyGPS.h>
TinyGPS gps;
String latitudString="0", longitudString="0";

String datosAenviar;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ;  // espera a que el puerto serie se conecte. Necesario para el puerto USB nativo solamente
  }
  Serial.println("El serial esta habilitado.");
  Serial1.begin(9600); // serialGaspar
  Serial2.begin(19200); // serialSIM 19200 | 115200
  // Serial2.println("AT+CGPSOUT=0");
  iniciarSIM808();
  delay(2000);
  Serial.print("Simple TinyGPS library v. ");
  Serial.println(TinyGPS::library_version());
  Serial.println("by Mikal Hart");
  Serial.println("LISTO!");
  Serial.println();
}

void loop() {
  miliActualoGaspar = millis();
  miliActualoGPS = millis();

  /* *************** SECCIÓN DEL GASPAR *************** */
  if (miliActualoGaspar - miliPrevioGaspar >= intervaloGaspar) {
    miliPrevioGaspar = miliActualoGaspar;

    // Serial1.listen();
    while (Serial1.read() > 0) {
      Serial.println("Datos de SerialGaspar:");
      obteniendoDatos();
      Serial.println();
      // comandosATEnviarDatos();
      // enviarPeticionPOST();
      // enviarPOST();
      // enviarGET();
      // enviarGET3();
      // enviarPOSTsimple();
      // enviarGETxTCP();
      thing();
    }
  }

  /* *************** SECCIÓN DEL GPS *************** */
  if (miliActualoGPS-miliPrevioGPS >= intervaloGPS) {
    miliPrevioGPS = miliActualoGPS;
    obteniendoGPS();
    // Serial.print("latitudString: ");Serial.println(latitudString);
    // Serial.print("latitudGuardada: ");Serial.println(latitudGuardada);
    // Serial.print("longitudString: ");Serial.println(longitudString);
    // Serial.print("longitudGuardada: ");Serial.println(longitudGuardada);
    if ((latitudString != latitudGuardada) || (longitudString != longitudGuardada)) {
      latitudGuardada = latitudString;
      longitudGuardada = longitudString;
    }
  }
}

void thing()
{
  Serial2.println("AT+CGPSOUT=1");
  delay(1000);

      float h = 20;
      float t = 10; 
      delay(100);   
         
      Serial.print("Temperature = ");
      Serial.print(t);
      Serial.println(" °C");
      Serial.print("Humidity = ");
      Serial.print(h);
      Serial.println(" %");    
      
   
  if (Serial2.available())
    Serial.write(Serial2.read());
 
  Serial2.println("AT");
  delay(1000);
 
  Serial2.println("AT+CPIN?");
  delay(1000);
 
  Serial2.println("AT+CREG?");
  delay(1000);
 
  Serial2.println("AT+CGATT?");
  delay(1000);
 
  Serial2.println("AT+CIPSHUT");
  delay(1000);
 
  Serial2.println("AT+CIPSTATUS");
  delay(2000);
 
  Serial2.println("AT+CIPMUX=0");
  delay(2000);
 
  ShowSerialData();
 
  Serial2.println("AT+CSTT=\"internet.itelcel.com\"");//start task and setting the APN,
  delay(1000);
 
  ShowSerialData();
 
  Serial2.println("AT+CIICR");//bring up wireless connection
  delay(3000);
 
  ShowSerialData();
 
  Serial2.println("AT+CIFSR");//get local IP adress
  delay(2000);
 
  ShowSerialData();
 
  Serial2.println("AT+CIPSPRT=0");
  delay(3000);
 
  ShowSerialData();
  
  Serial2.println("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",\"80\"");
  // Serial2.println("AT+CIPSTART=\"TCP\",\"mi.api.net\",\"8025\"");
  delay(6000);
 
  ShowSerialData();
 
  Serial2.println("AT+CIPSEND");
  delay(4000);
  ShowSerialData();
  
  // String str="GET https://api.thingspeak.com/update?api_key=JRT5KQR8EQDSKLDE&field1=" + String(t) +"&field2="+String(h);
  String str="GET https://api.thingspeak.com/update?api_key=JRT5KQR8EQDSKLDE"+datosThingSpeakGET; //ACTUALMENTE ENVIO LOS DATOS A ThingSpeak, pero no es lo deseado, sino mandarlo directamente a mi API, lo hice solo para darme cuenta de que el codigo si funciona, "ESTE CODIGO"
  // String str="GET http://mi.api.net:8025/controlador/ard?p=11.15&t=211.85&l=19.00&s=2178&f=27/09/21 10:15:59&la=25.1234567&lo=-103.1234567"; // esta api no existe, solo por privacidad la cambio.
  Serial.println(str);
  Serial2.println(str);
  
  delay(4000);
  ShowSerialData();
 
  Serial2.println((char)26);
  delay(5000);
  Serial2.println();
 
  ShowSerialData();
 
  Serial2.println("AT+CIPSHUT");
  delay(100);
  ShowSerialData();
} 
void ShowSerialData()
{
  while(Serial2.available()!=0)
  Serial.write(Serial2.read());
  delay(5000); 
  
}

Despues tenemos Gaspar.ino

/* *************** FUNCIONES DEL GASPAR *************** */
void obteniendoDatos() {
  // Serial.println("-------DATOS PUROS---------");
  // Serial.println(Serial.readString());
  // Serial.println("-------DATOS PUROS---------");
  char str[350] = "";
  memset(str, '\0', sizeof(str));
  Serial1.readString().toCharArray(str, 350);
  obtenerRenglones(str);
}
void obtenerRenglones(char *str) {
  // Serial.println("-------DATOS GASPAR---------");
  String datos[12];
  i = 0;
  resultado = strtok(str, delimitador);
  while (resultado != NULL) {
    // Serial.println(resultado);
    datos[i] = resultado;
    resultado = strtok(NULL, delimitador);
    i++;
  }
  obtenerValores(str, datos);
}
// void obtenerValores(float latitud, float longitud) {
void obtenerValores(char *str, String datos[12]) {
  // Serial.println("-----EL FOR-----");
  for (int f = 0; f < i; f++) {
    if (datos[f].indexOf(":") > 0) {
      bool hayDato = false;
      //      Serial.println("Hay puntos señores");
      //      if (datos[f].indexOf("UNIDAD") > 0) {
      //        hayDato = true;
      //      }
      if (datos[f].indexOf("PRECIO") > 0) {
        hayDato = true;
        cv = 0;
        Serial.println("Hay Precio");
      }
      if (datos[f].indexOf("IMPORTE") > 0) {
        hayDato = true;
        cv = 1;
        Serial.println("Hay importe");
      }
      if (datos[f].indexOf("LITROS") > 0) {
        hayDato = true;
        cv = 2;
        Serial.println("Hay litros");
      }
      //      if (datos[f].indexOf("MEDIDOR") > 0) {
      //        hayDato = true;
      //      }
      if (datos[f].indexOf("SERVICIO") > 0) {
        hayDato = true;
        cv = 3;
        Serial.println("Hay servicio");
      }
      if (datos[f].indexOf("FECHA") > 0) {
        hayDato = true;
        cv = 4;
        Serial.println("Hay fecha");
      }
      if (hayDato) {
        datos[f].toCharArray(str, 350);
        if (cv == 4) {
          valores = strtok(str, delimitadorEspacio);
        } else {
          valores = strtok(str, delimitadorV);
        }
        int v = 0;
        while (valores != NULL) {
          if (v == 1) {
            dataValores[cv] = valores;
            break;
          }
          while (cv >= 4) {
            if (v > 0 && v < 3) {
              dataValores[cv] = valores;
              cv++;
            }
            v++;
            valores = strtok(NULL, delimitadorEspacio);
            if (v > 3) {
              break;
            }
          }
          valores = strtok(NULL, delimitadorV);
          v++;
        }
      }
    }
  }
  // Serial.println("-----AL JSON-------");
  float precio_gas = dataValores[0].toFloat();
  float total = dataValores[1].toFloat();
  float litros = dataValores[2].toFloat();
  int servicio = dataValores[3].toInt();
  String fecha = dataValores[4];
  String hora = dataValores[5];
  Serial.println("-----EL JSON-------");
  // String jj = "";
  // jj = "{\"precio_gas\":";
  // jj += precio_gas;
  // jj += ",\"total\":";
  // jj += total;
  // jj += ",\"litros\":";
  // jj += litros;
  // jj += ",\"servicio\":";
  // jj += servicio;
  // jj += ",\"fecha\":\"";
  // jj += fecha;
  // jj += " ";
  // jj += hora;
  // jj += "\",\"latitud\":";
  // jj += latitudGuardada;
  // jj += ",\"longitud\":";
  // jj += longitudGuardada;
  // jj += "}";
  // Serial.println(jj);
  // datosEnGET = "";
  // datosEnGET = "p=";
  // datosEnGET += precio_gas;
  // datosEnGET += "&t=";
  // datosEnGET += total;
  // datosEnGET += "&l=";
  // datosEnGET += litros;
  // datosEnGET += "&s=";
  // datosEnGET += servicio;
  // datosEnGET += "&f=";
  // datosEnGET += fecha;
  // datosEnGET += " ";
  // datosEnGET += hora;
  // datosEnGET += "&la=";
  // datosEnGET += latitudGuardada;
  // datosEnGET += "&lo=";
  // datosEnGET += longitudGuardada;
  // Serial.println(datosEnGET);
  datosThingSpeakGET = "";
  datosThingSpeakGET = "&field1=";
  datosThingSpeakGET += precio_gas;
  datosThingSpeakGET += "&field2=";
  datosThingSpeakGET += total;
  datosThingSpeakGET += "&field3=";
  datosThingSpeakGET += litros;
  datosThingSpeakGET += "&field4=";
  datosThingSpeakGET += servicio;
  datosThingSpeakGET += "&field5=";
  datosThingSpeakGET += fecha;
  datosThingSpeakGET += " ";
  datosThingSpeakGET += hora;
  datosThingSpeakGET += "&field6=";
  datosThingSpeakGET += latitudGuardada;
  datosThingSpeakGET += "&field7=";
  datosThingSpeakGET += longitudGuardada;
  // Serial.println(datosThingSpeakGET);
  serializeObject(precio_gas, total, litros, servicio, fecha, hora, latitudGuardada, longitudGuardada);

}
void serializeObject(float p, float t, float l, int s, String f, String h, String lat, String lon) {
  StaticJsonDocument<1024> datosGaspar;
  datosGaspar["precio_gas"] = p;
  datosGaspar["total"] = t;
  datosGaspar["litros"] = l;
  datosGaspar["servicio"] = s;
  datosGaspar["fecha_hora"] = f+" "+h;
  datosGaspar["latitud"] = lat;//.toFloat();
  datosGaspar["longitud"] = lon;//.toFloat();

  serializeJson(datosGaspar, json);
  Serial.println(json);
}
}

Y POR ÚLTIMO, PASA POR SIM808.ino en este punto, ya me guardo los datos en la variable json. el metodo void iniciarSIM() se ejecuta en el void setup()

/*
  AT ----------------> Sirve para verificar si el módulo está funcionando adecuadamente para entrar en modo comando.
  ABRE GPS ----------> AT+CGPSPWR=1
  CHECAR STATUS -----> AT+CGPSSTATUS?
  CIERRA GPS --------> AT+CGPSPWR=0
  COORDENADAS -------> AT+CGPSOUT=32
  CONECTARSE A RED --> AT+CGATT=1
*/

/* *************** INICIALIZANDO MODULO SIM808 Y GPS *************** */
  void iniciarSIM808() {
    int respuesta = 0;
    if (enviarAT("AT","OK",2000) == 0) {
      delay(2000);
      while (respuesta == 0) {
        // Ciclarse mientras conecta GPS
        // Sirve para verificar si el módulo está funcionando adecuadamente para entrar en modo comando.
        respuesta = enviarAT("AT","OK",2000);
        Serial2.println(respuesta);
      }
    }
    Serial.println("GPS conectado");

    while (enviarAT("AT+CGPSPWR=1","OK",1000) == 0)
      ; // Ciclarse mientras enciende el GPS
    Serial.println("GPS encendido");

    // while (enviarAT("AT+CGPSOUT=1","OK",3000) == 0)
    //   ; // Ciclarse mientras se configura la salida de datos del GPS en desactivada


    /* ------------------ COMANDOS PARA CONECTAR A INTERNET ------------------*/
      // enviarAT("AT+CGATT=1","OK\r\n",1000);//Conectarse a la red
      // for (int i=0; i < 2; i++) {enviarAT("AT+HTTPTERM\r\n","OK",1000);}//Finalizar sesión HTTP
      // // Serial.println("");
      // for (int i=0; i < 2; i++) {enviarAT("AT+SAPBR=0,1\r\n","OK",1000);}//Cerrar el servicio HTTP
      // Serial.println("");
      // while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",3000) == 0)
      //   ; // Ciclarse mientras establece parámetro de portador
      // // Serial.println("");
      // while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",3000) == 0)
      //   ; // Ciclarse mientras establece contexto de portador
      // // Serial.println("");
      // while (enviarAT("AT+SAPBR=1,1\r\n","OK",3000) == 0)
      //   ; // Ciclarse mientras activa contexto de portador
      // // Serial.println("");
      // while (enviarAT("AT+SAPBR=2,1\r\n","OK",3000) == 0)
      //   ; // Ciclarse mientras lee parámetro de portador
      // Serial.println("");

      // Serial2.println("AT+CIPSTATUS"); //Consultar el estado actual de la conexión
      // delay(2000);
      // Serial2.println("AT+CIPMUX=0"); //comando configura el dispositivo para una conexión IP única o múltiple 0=única
      // delay(3000);
      // mostrarDatosSeriales();
      // Serial2.println("AT+CSTT=\"internet.itelcel.com\",\"webgprs\",\"webgprs2003\""); //comando configura el APN, nombre de usuario y contraseña."gprs.movistar.com.ar","wap","wap"->Movistar Arg.
      // delay(1000);
      // mostrarDatosSeriales();
      // Serial2.println("AT+CIICR"); //REALIZAR UNA CONEXIÓN INALÁMBRICA CON GPRS O CSD
      // delay(3000);
    /* ------------------ COMANDOS PARA CONECTAR A INTERNET ------------------*/

    while (enviarAT("AT+CGPSOUT=32\r\n","OK",1000) == 0)
      ; // Ciclarse mientras se configura la salida de datos del GPS
    Serial.println("GPS activo");
    Serial.println();
  }

  int enviarAT(String comandoAT, char* respuestaCorrecta, unsigned int tiempo) {
    int x = 0;
    bool correcto = 0;
    char respuesta [100];
    unsigned long anterior;
    memset(respuesta, '\0', 100);
    delay(100);
    while(Serial2.available() > 0) Serial2.read();
    Serial2.println(comandoAT);
    x = 0;
    anterior = millis();
    do {
      if (Serial2.available() != 0) {
        respuesta[x] = Serial2.read();
        x++;
        if (strstr(respuesta, respuestaCorrecta) != NULL) {
          correcto = 1;
        }
      }
    } while ((correcto == 0) && ((millis() - anterior) < tiempo));
    Serial.println(respuesta);
    return correcto;
  }
  int enviarPeticion(String comandoAT, char* respuestaCorrecta, unsigned int tiempo, int longitud) {
    // Serial.print("longitud:");Serial.println(longitud);
    int x = 0;
    bool correcto = 0;
    char respuesta [longitud]; //longitud | 100
    unsigned long anterior;
    memset(respuesta, '\0', longitud); //longitud | 100
    delay(100);
    while(Serial2.available() > 0) Serial2.read();
    Serial2.flush();
    Serial2.println(comandoAT);
    x = 0;
    anterior = millis();
    do {
      if (Serial2.available() != 0) {
        respuesta[x] = Serial2.read();
        x++;
        Serial.print("respuesta: "); Serial.println(respuesta);
        if (strstr(respuesta, respuestaCorrecta) != NULL) {
          correcto = 1;
        }
      }
    } while ((correcto == 0) && ((millis() - anterior) < tiempo));
    // Serial.print("correcto: "); Serial.println(correcto);
    // Serial.print("respuesta FINAL: ");
    Serial.println(respuesta);
    return correcto;
  }
  // int enviarData(String comandoAT, char* respuestaCorrecta, unsigned int tiempo, int longitud) {
    //   int x = 0;
    //   // Serial2.flush();
    //   bool correcto = 0;
    //   bool dataJson = 0;
    //   char respuesta [longitud];
    //   char respuestaJson [json.length()];
    //   unsigned long anterior;
    //   memset(respuesta, '\0', longitud);
    //   delay(100);
    //   while(Serial2.available() > 0) Serial2.read();
    //   Serial2.println(comandoAT);
    //   x = 0;
    //   anterior = millis();
    //   do {
    //     if (Serial2.available() != 0) {
    //       respuesta[x] = Serial2.read();
    //       x++;
    //       Serial.print("respuesta url: "); Serial.println(respuesta);
    //       Serial.print("respuestaCorrecta url: "); Serial.println(respuestaCorrecta);
    //       if (strstr(respuesta, "DOWNLOAD") != NULL) {
    //         Serial.println("DOWNLOAD...");
    //         json.toCharArray(respuestaJson, json.length());
    //         Serial.print("respuestaJSON: "); Serial.println(respuestaJson);
    //         Serial.print("respuestaJSON: "); Serial.println(respuestaJson);
    //         dataJson = 1;
    //       }
    //       if (dataJson) {
    //         if (strstr(respuesta, respuestaCorrecta) != NULL) {
    //           correcto = 1;
    //         }
    //       }
    //     }
    //   } while ((correcto == 0) && ((millis() - anterior) < tiempo));
    //   Serial.println(respuesta);
    //   return correcto;
  // }
/* *************** INICIALIZANDO MODULO SIM808 Y GPS *************** */


/* *************** FUNCIONES DEL GPS *************** */
  void obteniendoGPS() {
    bool newData = false;
    unsigned long chars;
    unsigned short sentences, failed;
    // Durante un segundo, analizamos los datos del GPS e informamos algunos valores clave.
    for (unsigned long start = millis(); millis() - start < 1000;) {
      while (Serial2.available()) {
        char c = Serial2.read();
        // Serial.write(c); // Descomente esta línea si desea ver el flujo de datos GPS
        if (gps.encode(c))  // ¿Ha entrado una nueva sentencia válida?
          newData = true;
      }
    }

    if (newData) {
      float flat, flon;
      unsigned long age;
      gps.f_get_position(&flat, &flon, &age);
      latitudString = String(flat,7);
      longitudString = String(flon,7);
    }
    gps.stats(&chars, &sentences, &failed);
    if (chars == 0)
      Serial.println("** No se han recibido caracteres del GPS: compruebe el cableado **");
  }

  /*
    // void comandosATEnviarDatos() {
    //   while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
    //     ;// Cerrar los datos que envia el GPS
    //   Serial.println("Ejecutando comandos para enviar datos a la API...");
    //   Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
    //   delay(1000);
    //   Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
    //   delay(2000);
    //   while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
    //     ;//Revisar conexión del SIM
    //   while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
    //     ;//
    //   while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
    //     ;//
    //   while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
    //     ;//Se inicia el servicio HTTP
    //   while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
    //     ;//Para llamar HTTP
    //   // Serial.println();
    //   // String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "\"\r\n";
    //   String peticion = "AT+HTTPPARA=\"URL\",\"http://mi.api.net:8025/controlador/ard\"\r\n";
    //   // Serial2.println("AT+HTTPPARA=\"URL\",\"http://mi.api.net:8025/controlador/ard\"\r\n");//Configurar el encabezado para enviar json y enseguida enviar JSON
    //   // Serial2.println(peticion);
    //   // mostrarDatosSeriales();
    //   // delay(1000);
    //   // while (enviarAT("AT+HTTPPARA=\"URL\",\"http://mi.api.net:8025/controlador/ard\"\r\n","OK",2000) == 1)
    //   // //   ;// URL de peticion
    //   enviarAT(peticion, NULL,1000);
    //   //   ;//
    //   String httpData = "AT+HTTPDATA="+(String)json.length()+",10000\r\n";
    //   Serial2.println(httpData);//Configurar el encabezado para enviar json y enseguida enviar JSON
    //   mostrarDatosSeriales();
    //   Serial2.println(json);
    //   mostrarDatosSeriales();
    //   // delay(10000);
    //   while (enviarAT("AT+HTTPACTION=1\r\n","OK",2000) == 0)
    //   ;// Indicando tipo de peticion HTTP (0=GET | 1=POST)
    //   while (enviarAT("AT+HTTPREAD\r\n","OK",2000) == 0)
    //     ;// Configurar el encabezado para enviar json: longitud de caracteres a enviar
    //   while (enviarAT("AT+HTTPTERM\r\n","OK",2000) == 0)
    //     ;// Configurar el encabezado para enviar json: longitud de caracteres a enviar
    //   Serial2.println("AT+CGPSOUT=32");
    //   delay(500);
    //   Serial.println("DATOS ENVIADOS.");
    // }

    // void enviarPeticionPOST() {
    //   while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
    //     ;// Cerrar los datos que envia el GPS
    //   Serial.println("Ejecutando comandos para enviar datos a la API...");
    //   Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
    //   delay(1000);
    //   Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
    //   delay(2000);
    //   while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
    //     ;//Revisar conexión del SIM
    //   while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
    //     ;//
    //   while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
    //     ;//
    //   while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
    //     ;//Se inicia el servicio HTTP
    //   while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
    //     ;//Para llamar HTTP
    //   // Serial2.println("AT+CGPSOUT=1\r\n");
    //   // mostrarDatosSeriales();
    //   // delay(1500);
    //   // Serial.println("Ejecutando comandos para enviar datos a la API...");
    //   // Serial2.println("AT+HTTPTERM\r\n");
    //   // mostrarDatosSeriales();
    //   // delay(1500);
    //   // Serial2.println("AT+SAPBR=0,1\r\n");
    //   // mostrarDatosSeriales();
    //   // delay(1500);
    //   // Serial2.println("AT+CGATT=1\r\n");
    //   // mostrarDatosSeriales();
    //   // delay(1500);
    //   // Serial2.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n");
    //   // mostrarDatosSeriales();
    //   // delay(2500);
    //   // Serial2.println("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n");
    //   // mostrarDatosSeriales();
    //   // delay(2500);
    //   // Serial2.println("AT+HTTPINIT\r\n");
    //   // mostrarDatosSeriales();
    //   // delay(2500);
    //   // Serial2.println("AT+HTTPPARA=\"CID\",1\r\n");
    //   // mostrarDatosSeriales();
    //   // delay(2500);
    //   String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "\"\r\n";
    //   // Serial2.println("AT+HTTPPARA=\"URL\",\"http://mi.api.net:8025/controlador/ard\"\r\n");
    //   // enviar_de_Serial1_a_Serial2();
    //   // Serial2.println(peticion);
    //   // mostrarDatosSeriales();
    //   enviarAT("AT+HTTPPARA=\"URL\",\"http://mi.api.net:8025/controlador/ard\"","OK",10000);
    //     //Para llamar HTTP
    //   // while(Serial2.available() > 0) Serial2.read();
    //   // Serial2.println(comandoAT);
    //   delay(2000);
    //   String httpData = "AT+HTTPDATA="+(String)json.length()+",5000\r\n";
    //   // Serial2.println(httpData);
    //   // // enviar_de_Serial1_a_Serial2();
    //   // mostrarDatosSeriales();
    //   // while (enviarData(httpData,"DOWNLOAD",1000) == 0)
    //     ;//Para llamar HTTP
    //   // delay(2500);
    //   // enviarAT(json," ",1000);
    //   // Serial.println(json);
    //   // enviar_de_Serial1_a_Serial2();
    //   Serial2.println((char)26);
    //   // mostrarDatosSeriales();

    //   delay(2500);
    //   Serial2.println("AT+HTTPACTION=1\r\n");
    //   mostrarDatosSeriales();
    //   delay(2500);
    //   Serial2.println("AT+HTTPREAD\r\n");
    //   mostrarDatosSeriales();
    //   delay(2500);
    //   Serial2.println("AT+HTTPTERM\r\n");
    //   mostrarDatosSeriales();
    //   delay(2500);
    //   Serial2.println("AT+CGPSOUT=32\r\n");
    //   mostrarDatosSeriales();
    //   delay(2500);
    //   Serial.println("DATOS ENVIADOS.");
    // }

  */
  

  void mostrarDatosSeriales() { //Muestra los datos que va entregando el sim
    while(Serial2.available()!=0)
      Serial.write(Serial2.read());
    Serial.println();
  }

  void enviar_de_Serial1_a_Serial2(int inter) {
    unsigned long miliPrevio = 0;
    unsigned long miliActual = millis();
    const long intervalo = inter;
    while (miliActual - miliPrevio >= intervalo){
      miliPrevio = miliActual;
      if (Serial.available() > 0)
        Serial2.write(Serial.read());
    
      if (Serial2.available() > 0)
        Serial.write(Serial2.read());
    }
  }
  void enviarPOST() {
    while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
      ;// Cerrar los datos que envia el GPS
    Serial.println("Ejecutando comandos para enviar datos a la API...");
    Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
    delay(1000);
    Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
    delay(2000);
    while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
      ;//Revisar conexión del SIM
    while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
      ;//
    while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
      ;//
    while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
      ;//Se inicia el servicio HTTP
    while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
      ;//Para llamar HTTP

    // url = "http://dev.teubi.co/hola.php";
    String peticion = "AT+HTTPPARA=\"URL\",\"" + url;
    // Serial2.println(peticion);
    // while (enviarPeticion(peticion,"OK",3000, peticion.length()) == 0)
    while (enviarAT(peticion,"OK",6000) == 0)
      ;
    // // Serial.write(Serial.read());
    // // enviar_de_Serial1_a_Serial2();
    //   //Para llamar HTTP
    // // delay(2000);
    enviarAT("AT+HTTPPARA=\"CONTENT\",\"application/json\"\r\n","OK",1000);
    String httpData = "AT+HTTPDATA="+(String)json.length()+",5000";
    // // Serial.println(httpData);
    // // enviar_de_Serial1_a_Serial2();
    // // mostrarDatosSeriales();
    // // Serial.println(httpData.length());
    enviarPeticion(httpData,"OK",2000, httpData.length());
    // // enviarData(httpData,"OK",2000, httpData.length());
    //     //Para llamar HTTP
    // delay(2500);
    // enviarAT(json," ",1000);
    // // Serial2.println(json);
    // // enviar_de_Serial1_a_Serial2();
    Serial2.println((char)26);
    // // mostrarDatosSeriales();

    delay(2500);
    Serial2.println("AT+HTTPACTION=1\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+HTTPREAD\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+HTTPTERM\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+CGPSOUT=32\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial.println("DATOS ENVIADOS.");
  }
  void enviarPOSTsimple() {
    // Cerrar los datos que envia el GPS
    Serial2.println("AT+CGPSOUT=1\r\n");
    delay(1000);

    Serial.println("Ejecutando comandos para enviar datos a la API...");
    Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
    delay(1000);
    Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
    delay(2000);
    //Revisar conexión del SIM
    Serial2.println("AT+CGATT=1\r\n");
    delay(1000);
    Serial2.println("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n");
    delay(1000);
    Serial2.println("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n");
    delay(1000);
    
    //Se inicia el servicio HTTP
    Serial2.println("AT+HTTPINIT\r\n");
    delay(1000);

    //Para llamar HTTP
    Serial2.println("AT+HTTPPARA=\"CID\",1\r\n");
    delay(1000);

    //Parametros
    String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "\"\r\n";
    // String peticion = "AT+HTTPPARA=\"URL\",\"http://dev.teubi.co/hola.php\"\r\n";
    // Serial2.println(peticion);
    Serial2.println(peticion);
    delay(2500);
    Serial2.println("AT+HTTPPARA=\"CONTENT\",\"application/json\"\r\n");
    delay(1000);
    String httpData = "AT+HTTPDATA="+(String)json.length()+",10000";
    Serial2.println(httpData);
    delay(4000);
    Serial2.println(json);
    Serial2.println((char)26);

    delay(2500);
    Serial2.println("AT+HTTPACTION=1\r\n");
    delay(2500);
    Serial2.println("AT+HTTPREAD\r\n");
    mostrarDatosSeriales();
    // Serial2.println("AT+HTTPREAD\r\n");
    // delay(2500);
    Serial2.println("AT+HTTPTERM\r\n");
    delay(2500);
    Serial2.println("AT+CGPSOUT=32\r\n");
    delay(2500);
    Serial.println("DATOS ENVIADOS.");
  }

  
  void enviarGET() {
    while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
      ;// Cerrar los datos que envia el GPS
    Serial.println("Ejecutando comandos para enviar datos a la API...");
    Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
    delay(1000);
    Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
    delay(2000);
    while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
      ;//Revisar conexión del SIM
    while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
      ;//
    while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
      ;//
    while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
      ;//Se inicia el servicio HTTP
    while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
      ;//Para llamar HTTP

    String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "?" + datosEnGET + "\"";
    Serial.println(peticion);
    // while (enviarPeticion(peticion,"OK",20000, peticion.length()) == 0)
    while (enviarAT(peticion,"OK",20000) == 0)
      ; //nada
    // Serial.write(Serial.read());
    // enviar_de_Serial1_a_Serial2();
      //Para llamar HTTP
    // delay(2000);

    delay(2500);
    Serial2.println("AT+HTTPACTION=0\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+HTTPREAD\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+HTTPTERM\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+CGPSOUT=32\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial.println("DATOS ENVIADOS.");
  }
  void enviarGET2() {
    while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
      ;// Cerrar los datos que envia el GPS
    Serial.println("Ejecutando comandos para enviar datos a la API...");
    Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
    delay(1000);
    Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
    delay(2000);
    while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
      ;//Revisar conexión del SIM
    while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
      ;//
    while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
      ;//
    while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
      ;//Se inicia el servicio HTTP
    while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
      ;//Para llamar HTTP

    String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "?" + datosEnGET + "\"";
    Serial.println(peticion);
    // while (enviarPeticion(peticion,"OK",20000, peticion.length()) == 0)
      // ;
    int u = 0;
    int r = 0;
    char urlGet [peticion.length()];
    char urlRespuesta [2];
    peticion.toCharArray(urlGet,peticion.length());
    Serial.print("urlGET: ");Serial.println(urlGet);
    while(u <= peticion.length()){
      // Serial.write(urlGet[u]);
        Serial2.write(urlGet[u]);
        u++;
    }
    while (r < 2) {
      urlRespuesta[r] = Serial2.read();
      Serial.print("respuestaaaa: ");Serial.println(urlRespuesta);
      r++;
    }
      
    delay(5000);
    // enviar_de_Serial1_a_Serial2();
      //Para llamar HTTP
    // delay(2000);

    delay(2500);
    Serial2.println("AT+HTTPACTION=0\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+HTTPREAD\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+HTTPTERM\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+CGPSOUT=32\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial.println("DATOS ENVIADOS.");
  }
  void enviarGET3() {
    while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
      ;// Cerrar los datos que envia el GPS
    delay(1000);
    while (enviarAT("AT+CIPSHUT\r\n","OK",1000) == 0)
      ; //cerrar conexion del SIM 
    delay(1000);
    while (enviarAT("AT+CGATT=0\r\n","OK",1000) == 0)
      ; //cerrar conexion del SIM 
    Serial.println("Ejecutando comandos para enviar datos a la API...");
    while (enviarAT("AT+CPIN?\r\n","OK",1000) == 0)
      ;//verificar si necesita algun PIN
    delay(1000);
    while (enviarAT("AT+CFUN?\r\n","OK",1000) == 0)
      ;//verifica que toda la funcionalidad este disponible
    delay(1000);
    while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
      ;//Revisar conexión del SIM
    enviarAT("AT+CSTT=\"internet.itelcel.com\",\"""\",\"""\"\r\n","OK",1000)
      ;//nos conectamos a nuestra APN
    delay(1000);
    while (enviarAT("AT+CIICR\r\n","OK",1000) == 0)
      ;//Habilitar conexiones Wireless
    enviarAT("AT+CIFSR\r\n","OK",1000)
      ;//Obtener IP local
    delay(1000);

    /*envio de peticion GET*/
    // enviarAT("AT+CIPSTART=\"TCP\",\"mi.api.net\",8025\r\n","CONNECT OK",1000)
    enviarAT("AT+CIPSTART=\"TCP\",\"dev.teubi.co\",80\r\n","CONNECT OK",1000)
      ;//creando una conexion tipo TCP al servidro X con puerto X
    delay(1000);
    enviarAT("AT+CIPSEND",">",1000); // Habilitamos la opcion de enviar
    // String peticion = "GET /controlador/ard?" + datosEnGET + " HTTP/1.1\r\n"+
    String peticion = "GET /hola.php\r\nHost: dev.teubi.co\r\nConnection: Keep-Alive\r\n\r\n\x1A";
                      // "Host: mi.api.net\r\n"+
    // Serial.println(peticion);
    // enviarPeticion(peticion,"OK",7000,peticion.length())
    enviarAT(peticion,"OK",7000)
      ; // Enviando peticion
    delay(5000);
    while (enviarAT("AT+CIPCLOSE\r\n","OK",20000) == 0)
      ;
    delay(1000);
    Serial2.println("AT+CGPSOUT=32\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial.println("DATOS ENVIADOS.");
  }
  void enviarGETsimple() {
    while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
      ;// Cerrar los datos que envia el GPS
    delay(1000);
    while (enviarAT("AT+CIPSHUT\r\n","OK",1000) == 0)
      ; //cerrar conexion del SIM 
    delay(1000);
    while (enviarAT("AT+CGATT=0\r\n","OK",1000) == 0)
      ; //cerrar conexion del SIM 
    Serial.println("Ejecutando comandos para enviar datos a la API...");
    while (enviarAT("AT+CPIN?\r\n","OK",1000) == 0)
      ;//verificar si necesita algun PIN
    delay(1000);
    while (enviarAT("AT+CFUN?\r\n","OK",1000) == 0)
      ;//verifica que toda la funcionalidad este disponible
    delay(1000);
    while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
      ;//Revisar conexión del SIM
    enviarAT("AT+CSTT=\"internet.itelcel.com\",\"""\",\"""\"\r\n","OK",1000)
      ;//nos conectamos a nuestra APN
    delay(1000);
    while (enviarAT("AT+CIICR\r\n","OK",1000) == 0)
      ;//Habilitar conexiones Wireless
    enviarAT("AT+CIFSR\r\n","OK",1000)
      ;//Obtener IP local
    delay(1000);

    /*envio de peticion GET*/
    // enviarAT("AT+CIPSTART=\"TCP\",\"mi.api.net\",8025\r\n","CONNECT OK",1000)
    enviarAT("AT+CIPSTART=\"TCP\",\"dev.teubi.co\",80\r\n","CONNECT OK",1000)
      ;//creando una conexion tipo TCP al servidro X con puerto X
    delay(1000);
    enviarAT("AT+CIPSEND",">",1000); // Habilitamos la opcion de enviar
    // String peticion = "GET /controlador/ard?" + datosEnGET + " HTTP/1.1\r\n"+
    String peticion = "GET /hola.php\r\nHost: dev.teubi.co\r\nConnection: Keep-Alive\r\n\r\n\x1A";
                      // "Host: mi.api.net\r\n"+
    // Serial.println(peticion);
    // enviarPeticion(peticion,"OK",7000,peticion.length())
    enviarAT(peticion,"OK",7000)
      ; // Enviando peticion
    delay(5000);
    while (enviarAT("AT+CIPCLOSE\r\n","OK",20000) == 0)
      ;
    delay(1000);
    Serial2.println("AT+CGPSOUT=32\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial.println("DATOS ENVIADOS.");
  }
  void enviarGETxTCP() {
    while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
      ;// Cerrar los datos que envia el GPS
    if (Serial2.available())
      Serial.write(Serial2.read());
    delay(1000);
    
    Serial2.println("AT");
    delay(1000);

    Serial2.println("AT+CPIN?");
    delay(1000);

    Serial2.println("AT+CREG?");
    delay(1000);

    Serial2.println("AT+CGATT?");
    delay(1000);

    Serial2.println("AT+CIPSHUT"); //cerrar conexion del SIM 
    delay(1000);

    Serial2.println("AT+CIPSTATUS");
    delay(2000);

    Serial2.println("AT+CIPMUX=0");
    delay(2000);

    mostrarDatosSeriales();

    Serial2.println("AT+CSTT=\"internet.itelcel.com\"");
    delay(1000);

    mostrarDatosSeriales();

    Serial2.println("AT+CIICR");
    delay(3000);

    mostrarDatosSeriales();

    Serial2.println("AT+CIFSR"); //optener IP local
    delay(2000);

    mostrarDatosSeriales();

    Serial2.println("AT+CIPSPRT=0");
    delay(3000);

    mostrarDatosSeriales();

    // http://mi.api.net:8025/controlador/ard
    // GET https://api.thingspeak.com/update?api_key=JRT5KQR8EQDSKLDE&field1=0
    Serial2.println("AT+CIPSTART=\"TCP\",\"api.thingspeak.com\",\"80\""); // Iniciamos la conexion a la api
    delay(6000);

    Serial2.println("AT+CIPSEND");
    delay(4000);
    mostrarDatosSeriales();
    String peticion = "GET https://api.thingspeak.com/update?api_key=JRT5KQR8EQDSKLDE"+datosThingSpeakGET;
    Serial.println(peticion);
    Serial2.println(peticion);
    delay(400);
    mostrarDatosSeriales();
    Serial2.println((char)26); //[Enter] | enviando peticion
    delay(500);
    Serial2.println();

    mostrarDatosSeriales();

    Serial2.println("AT+CIPSHUT"); //Cerrar conexión
    delay(100);
    mostrarDatosSeriales();
    Serial.println("DATOS ENVIADOS.");
  }

  void obtenerLocalizacion() {
    // datosAenviar =  "?lat="+latitudString + "&lon="+longitudString;
    // datosAenviar =  "{\"latitud\":"+(String)latitudGuardada + ",\"longitud\":"+(String)longitudGuardada + "}";
    Serial.println(datosAenviar);
  }

el metodo enviarAT es completamente igual a enviarPeticion solo que quise experimentar con Serial.print() para poder ver que estaba pasando exclusivamente con esa parte.

void enviarPOST() {
    while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
      ;// Cerrar los datos que envia el GPS
    Serial.println("Ejecutando comandos para enviar datos a la API...");
    Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
    delay(1000);
    Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
    delay(2000);
    while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
      ;//Revisar conexión del SIM
    while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
      ;//
    while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
      ;//
    while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
      ;//Se inicia el servicio HTTP
    while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
      ;//Para llamar HTTP

    String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "\"\r\n";
    // Serial.println(peticion);
    while (enviarPeticion(peticion,"OK",3000, peticion.length()) == 0)
      ; //**Aqui es donde se detiene el proceso**

    enviarAT("AT+HTTPPARA=\"CONTENT\",\"application/json\"\r\n","OK",1000);
    String httpData = "AT+HTTPDATA="+(String)json.length()+",5000";
    Serial2.println(httpData);
    delay(100);
    Serial2.println(json);
    Serial2.println((char)26);
    delay(2500);

    Serial2.println("AT+HTTPACTION=1\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+HTTPREAD\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+HTTPTERM\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+CGPSOUT=32\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial.println("DATOS ENVIADOS.");
  }
void enviarGET() {
    while (enviarAT("AT+CGPSOUT=1\r\n","OK",1000) == 0)
      ;// Cerrar los datos que envia el GPS
    Serial.println("Ejecutando comandos para enviar datos a la API...");
    Serial2.println("AT+HTTPTERM\r\n");//Finalizar sesión HTTP por si hay alguna abierta
    delay(1000);
    Serial2.println("AT+SAPBR=0,1\r\n");//Cerrar el servicio HTTP por si hay una en cola
    delay(2000);
    while (enviarAT("AT+CGATT=1\r\n","OK",1000) == 0)
      ;//Revisar conexión del SIM
    while (enviarAT("AT+SAPBR=3,1,\"Contype\",\"GPRS\"\r\n","OK",1000) == 0)
      ;//
    while (enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"\r\n","OK",1000) == 0)
      ;//
    while (enviarAT("AT+HTTPINIT\r\n","OK",1000) == 0)
      ;//Se inicia el servicio HTTP
    while (enviarAT("AT+HTTPPARA=\"CID\",1\r\n","OK",1000) == 0)
      ;//Para llamar HTTP

    String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "?" + datosEnGET + "\"\r\n";
    Serial.println(peticion);
    while (enviarPeticion(peticion,"OK",10000, peticion.length()) == 0)
      ;

    delay(2500);
    Serial2.println("AT+HTTPACTION=0\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+HTTPREAD\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+HTTPTERM\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial2.println("AT+CGPSOUT=32\r\n");
    mostrarDatosSeriales();
    delay(2500);
    Serial.println("DATOS ENVIADOS.");
  }

  void mostrarDatosSeriales() { //Muestra los datos que va entregando el sim
    while(Serial2.available()!=0)
      Serial.write(Serial2.read());
    Serial.println();
  }

si ven ambos metodos POST y GET son iguales, solo cambia la parte de la URL y pues en el PST se le agregan los parametros de CONTENT y DATA.

Adjunto imagen de como es que se pierde la url en metodo GET

Su publicacion se MUEVE a su ubicacion actual ya que es mas adecuada.

Hola @nestorpuentes mirando tu código no se como tienes definidas algunas variables responsables de lo que esta sucediendo.
Puedes postear todo el código o una versión que muestre las variables globales o locales involucradas?
A ver si con lo que muestras se puede responder.
Dices que enviarAT es igual que enviarPeticion. Ok.

Que pasa con datosEnGet, de donde sale?

1 Like

claro que si, en seguida lo actualizo.

@Surbyte , ya he agregado el código completo, me parece, omiti todas las pruebas en las que estoy intentando y lo comentado, pero eso es lo esencial del código y respondiendo directamente a tus comentarios...
ya están publicadas las variables globales y locales.
y datosEnGet es una variable global, donde guardo la cadena de clave=valor para enviarla por el metodo GET.

Muchas gracias por tu interés y apoyo.

Adjunto imagen de como es que se pierde la url en metodo POST

Me acabo de dar cuenta que usas un MEGA. Estoy viendo que ocurre con tu codigo.

Disculpa pero hay incongruencias en el codigo.
Falta enviarAT, sera igual que enviarPeticion pero se supone que uno va a ayudarte en tu problema puntual no en reconstruir un codigo que esta incompleto.

Supe por favor todo el codigo que compile sin ue falta nada asi nos concentramos en el problema puntual.

ok, aunque hay mucho código comentado. de tantas pruebas que he hecho

Moderador:
Mi estimado @nestorpuentes te envié un privado como Moderador que soy.
Deja por favor de editar el primer hilo porque cada comentario queda desconectado de lo que se te pide si respondes editando el primer hilo.
El primer hilo lo habías hecho correctamente. Faltaban cosas, las pones en un nuevo post pero no editas sin fin a cada intervención de los interlocutores porque luego no tiene sentido para el lector.
Te envié un privado pero tal vez no lo leíste.

1 Like

Buenas tardes comunidad, la verdad no se que pasaría que me tomo el código, este código ya lo tenia anteriormente y no funciono, pero ahora ya lo realiza, quizá hay que jugar con los delay() dejo el código funcional (Solo la parte de la petición, en esta ocasión lo realice por Petición GET)

void enviarPeticionGET() {
  // do {
    // respuestaPeticion = "0";

    Serial2.println("AT+CGPSOUT=1"); //Cierro el flujo de datos que recibo del GPS
    delay(1000);      
    
    Serial.println();

    Serial.println("Ejecutando comandos para enviar datos a la API...");

    Serial2.println("AT");
    delay(1000);
  
    Serial2.println("AT+HTTPTERM"); //Finalizar sesión HTTP por si hay alguna abierta antes de iniciar una sesión.
    delay(2000);
  
    Serial2.println("AT+SAPBR=0,1"); // Contexto de portador desactivado por si hay alguno activo
    delay(2000);
  
    Serial2.println("AT+CGATT=1");
    delay(2000);
  
    // Serial2.println("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"");
    // delay(3000);
    // mostrarDatosSerial();
    enviarAT("AT+SAPBR=3,1,\"APN\",\"internet.itelcel.com\"","OK",3000); //Establecer contexto de portador

    // Serial2.println("AT+SAPBR=1,1");
    // delay(2000);
    // mostrarDatosSerial();
    enviarAT("AT+SAPBR=1,1","OK",2000); //Contexto de portador activo

    // Serial2.println("AT+SAPBR=2,1");
    // delay(2000);
    // mostrarDatosSerial();
    while (enviarAT("AT+SAPBR=2,1","OK",1000) == 0)
      ; //Ciclar mientras Leer parámetro de portador este es MUY IMPORTANTE QUE LO RESPONDA CORRECTAMENTE
  
    Serial2.println("AT+HTTPINIT");//Se inicia el servicio HTTP
    delay(2000);
    mostrarDatosSerial();

    Serial2.println("AT+HTTPPARA=\"CID\",1"); //Para hacer la llamar a HTTP
    delay(2000);
  
    // String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "\"";
    String peticion = "AT+HTTPPARA=\"URL\",\"" + url + "?" + datosEnGET + "\"";
    Serial.println(peticion);
    Serial2.println(peticion); //Parametro URL a la que se realizara la peticion.
    delay(15000);
    mostrarDatosSerial();
  
    // Serial2.println("AT+HTTPACTION=0");//
    // delay(3000);
    // mostrarDatosSerial();
    enviarAT("AT+HTTPACTION=0","OK",3000); //Realiza acciones HTTP (GET=0  |  POST=1)
  
    // Serial.print("respuestaPeticion: ");Serial.println(respuestaPeticion);
    // Serial2.println("AT+HTTPREAD");
    // delay(4000);
    // mostrarRespuesta();
    enviarAT("AT+HTTPREAD","OK",3000); //Leer respuesta del servidor
    // if (respuestaPeticion == "1")
    //   peticionEnviada = 1;
    // Serial.print("respuestaPeticion: ");Serial.println(respuestaPeticion);
    
    Serial2.println("AT+HTTPTERM");//Finalizar sesión HTTP
    delay(2000); // 6000
    mostrarDatosSerial();
  
    Serial2.println("AT+CGPSOUT=32");//Abrir flujo de datos de GPS
    delay(4000);
    Serial.println();
  
    // if (peticionEnviada == 1)
      Serial.println("DATOS ENVIADOS.");
    Serial.println("********************************************************************");
    Serial.println();
  // } while (peticionEnviada == 0);
}
void mostrarDatosSerial() {
  while(Serial2.available()!=0)
    Serial.write(Serial2.read());
  delay(500); 
}

Lo que tengo comentado del doWhile , respuestaPeticion y peticionEnviada era porque intentaba ciclar la peticion mientras no se mandaba, pero aun no logro eso. y lo que esta comentado encima de cada ComandoAT es lo mismo pero enviandolo directamente al Serial2.

espero les sirva Saludos.

PD: el código del enviarAT esta al inicio del POST

Mi consejo y perdona que no pude probarlo pero tengo problemas con mi computadora.
La cuestion es que todo lo que se hace con delay() es un juego de azar.
Porque no estudias la posiblidad de escuchar la respuesta del SIM800?
Si tu le envias

Serial2.println("AT+CGATT=1");

El debe responder AT o algo mas? En cada caso puedes hacerlo de ese modo y el sistema será muchísimo mas ágil y hasta tendras una linea de control de errores.

1 Like

Perfecto mi buen @Surbyte ya tengo ese comando, implementare, tu consejo, muchas gracias.