Variables Globales Nulas despues de nueva asignacion

Hola a tod@s,
Tengo un archivos "config.h" en donde declaro la mayoría de las variables que usare.
También otro archivo que contiene funciones en donde se usan algunas de esas variables si es que no son todas.

El problema es de la siguiente forma :

  • Se cargan los #includes
  • setup(), aquí ejecuta una función que, carga un archivo inicial en json que se encuentra en el ESP01, este archivo se lee sin problemas, al leer este archivo, transfiero los datos de este a las variables globales. A modo de depuración, imprimo por serial algunas de variables para seguir el flujo y ver que desde eso todo sigue bien. Pero es aquí en donde empieza la magia...
    ... después de pasar el json a las variables, al intentar usar estas variables en otra función, llegan vacías y es ahí mi piedra de tope.
**config.h**
const char* ssid_srv="ESPServer";
const char* pswd_srv="12345678";
const char* ssid_sta="";
const char* pswd_sta="";

**ESP_Utils.hpp**
// Funcion que usa LittleFS para llamar un json
void CargaBoot(){
    String json = readFile("/json/boot.json");
    delay(500);
    if(json!=""&&json!=NULL){
      DynamicJsonDocument doc(350); 
      DeserializationError error = deserializeJson(doc, json);
      delay(500);
      if (error){return;}
        ssid_srv=doc["srv_ssid"].as<const char*>();
        pswd_srv=doc["srv_pswd"].as<const char*>();
        ssid_sta=doc["sta_ssid"].as<const char*>();
        pswd_sta=doc["sta_pswd"].as<const char*>();
        dataFile = String(ssid_srv)+";"+String(pswd_srv)+";"+String(ssid_sta)+";"+String(pswd_sta));
        Serial.println("["+dataFile+"]");
        delay(1000);
    }else{
      // Valores por defecto
      ssid_srv="ESPServer";
      pswd_srv="12345678";
      ssid_sta="";
      pswd_sta="";
   }
}
// Coneccion a WiFi
void ConnectWiFi_STA(bool useStaticIP = false){
  int linea = 0;
  WiFi.mode(WIFI_STA);
  Serial.println("");
  Serial.print("Conectando a WIFI Externa SEÑAL ");Serial.print(String(ssid_sta));Serial.print("/");Serial.print(String(pswd_sta));Serial.println("");
  delay(1000);
  WiFi.begin(ssid_sta, pswd_sta);
  if(useStaticIP) WiFi.config(ip, gateway, subnet); // Si es que usa una IP Statica
  // Ciclo de coneccion a WIFI
  while (WiFi.status() != WL_CONNECTED&&linea<3){
    linea++;
    for(int i=0;i<10;i++){
      Serial.print(".");
      delay(500);
    }
    Serial.println("");
  }  
  if(WiFi.status() == WL_CONNECTED){
    ip_actual =IpAddress2String(WiFi.localIP());
    modo_sta = 1;
    if (!MDNS.begin("esp01")) {
    }else{
      MDNS.addService("http", "tcp", 80);
    }
    Serial.println("Conectado a "+String(ssid_sta));
  }else{
    Serial.println("Pasando a modo AP "+String(ssid_srv)+"/"+String(pswd_srv));
    modo_sta = 0;
  }
}

**Setup()**
  delay(300);
  Serial.begin(9600);
  while(!Serial);
  LittleFS.begin();

  // Start server
  server.begin();
  CargaBoot();
  delay(1000);
  ConnectWiFi_STA();  // Iniciamos coneccion a wifi
  delay(1000);
  Serial.println("Modo "+String(modo_sta)+" / "+modo_esp+" Server "+String(ssid_srv)+"/"+String(pswd_srv));
  if (modo_sta == 0) {
    ConnectWiFi_AP(); // Iniciamos el modo AP
  }
  LoadWebServerFiles(); // Carga de archivos WebServer   

El resultado del monitor SERIAL es
variables ssid_srv pswd_srv ssid_sta pswd_sta
14:56:55.062 -> [ESPServer;12345678;MyWifi;87654321]
14:56:57.059 ->
14:56:57.059 -> Conectando a WIFI Externa SEÑAL [ ]/[ ]
14:56:58.059 -> ..........
14:57:03.029 -> ..........
14:57:08.055 -> ..........
14:57:13.068 -> Pasando a modo AP [ ]/[ ]
14:57:14.074 -> Modo 0 / SERVER Server modo AP [ ]/[ ]/[ ]
14:57:14.578 -> Servidor([ ]) AP Activado

Como se puede apreciar el donde he puesto corchetes, se debería ver el dato, sin embargo esto no ocurre y he intentado varias formas y maneras y el resultado sigue siendo el mismo.

La primera linea del monitor, es un print dentro de la función ("CargaBoot()") que lee el json, y si, realizo otra impresión después de esta ejecución, me imprime sin problemas los valores, pero no en la funcion siguiente (ConnectWiFi_STA()) .

Alguna idea de puede ser lo que este ocurriendo?

Esta es unas declaraciónas absolutamente sin sentido. Aquí ha definido un puntero a una variable vacía. No ha asignado memoria para ella. No puedes cambiarla más tarde porque es una constante.

Hola b707, efectivamente es una respuesta esperada, leí sobre declarar variables conts y sin ella.
Probé también iniciarlas con datos y solo para ver el comportamiento, asumiendo que, en el peor de los casos, me mostraría los datos que asigne inicialmente. Lamentablemente el comportamiento fue exactamente el mismo, con o sin datos, me sigue mostrando los datos vacíos.

Al definir una nueva text variable, debe asignarle memoria.
Esto es un error:

Así es correcto:

char ssid[20] = "";

donde 20 es la longitud máxima de SSID

Haga lo mismo para todas las variables de texto.

Excelente! probare con eso y les comento.

cuando haces esto:

doc es una variable local que desaparecerá cuando finalice if. La memoria será liberada y utilizada para otra cosa. En consecuencia, sus punteros solo apuntarán a datos aleatorios.

➜ intente hacer doc una variable global

➜ alternativamente, asigne memoria para sus variables y use strncpy() para copiar el contenido JSON en la memoria de su variable

Además, no puede asignar matrices de caracteres como esta:

Todavía tienes muchos errores en tu código. Lea el tutorial sobre cómo trabajar con variables de texto

En algun momento las tenia globales y me genero duplicidad de datos en la variable DOC y usaba doc.clear() para asegurarme que tener limpia esta variable. Investigare sobre el strcpy() que lo use una vez para pasar de EEPROM a variables.

Creo que tienes razón, a veces la mala costumbre por algunos lenguajes que manejan la asignación de viables de forma universal.

Las declaro de char pero las trato de como string.

Leeré sobre lo que me comentas y realizare los cambios de asignación.

Hola a todos, gracias a sus comentarios y criticas, he terminado la primera de dos etapas de mi proyecto.

Efectivamente, la mala asignación de variables me estaba causando muchos problemas y aplique de forma conjunta las soluciones dadas por Uds.

El ESP01, tiene un webserver cargado con custom Bootstrap para facilitar la visualización
Esta etapa tiene la finalidad monitorizar una caja hermética para filamentos de impresión 3D, manteniendo la una temperatura constante y humedad baja (menos del 20%), a su vez que secara los filamentos húmedos.

La segunda etapa se pretende controlar la resistencia que genera el calor y en lo posible con un control PID, para lo cual, probablemente sepan de mi.

Saludos.
Adjunto 2 imágenes del proyecto funcionando.


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