Go Down

Topic: Mi Sketch se clava (Read 318 times) previous topic - next topic

ingsaac

Hola!Como estan?
Estoy realizando un proyecto con  Arduino Mega 2560 y un Ethernet Shield.
El proyecto consiste basicamente en enviar una peticion web con datos sobre el estado de 11 sensores y desde la pagina se envia informacion relacionada con la accion que realizaran los sensores segun su estado. El programa esta dividido en distintas funciones, que corresponden a las diferentes partes que realiza el programa (Lectura de sensores, Acciones a realizar, Envio a la Web y Lectura de datos de la Web).
Yo probe cada una de estas funciones de manera separada para ajustar los detalles y corregir errores antes de probar todo junto pero cuando pruebo todo junto el sketch deja de funcionar en la funcion Envio a la Web, con cualquiera de las sentencias de clase cliente(client.available, client.connect, client.print o client.stop).
Pense que podria ser un problema de memoria ya que la diferencia entre el programa total y los programas con cada funcion es su tamaño, pero al parecer me equivoque ya que aun me quedan unos 4000 bytes disponibles de SRAM.
La funcion que presenta problema en el sketch general es esta:

void setup()
{
    Serial.begin(9600);
    delay(200);
    Serial.println("Comenzando la prueba");
    if (Ethernet.begin(mac) == 0) {
      Ethernet.begin(mac, ip, dnServer, gateway, subnet);
      Serial.println("Conectado 0");
    }
    else if(Ethernet.begin(mac)==1){
      Serial.println("Conectado 1");
    }
    Serial.print("SRAM libre: "); Serial.println(freeRam());
    delay(2000);
}

void loop()
{
  Serial.println("Leer datos de web"); 
  Serial.print("Memoria disponible: ");
  Serial.println(memoryTest()); 
  Serial.print("SRAM libre: "); Serial.println(freeRam());
  if (client.connect(server,80))
    {       
        client.print(Cabecera);     
        Serial.print(Cabecera);
        client.println(Peticion.length());                           
        Serial.println(Peticion.length());
        client.println();
        Serial.println();
        client.println(Peticion);           
        Serial.println(Peticion);
        while (Lectura == true)
   {
      if(client.available())
         {
            char c = client.read();
            Respuesta[index]=c;
                                Serial.println(Respuesta);   
            if((index>0)&&(auxlec==true))
               {
                  if(Respuesta[index]=='\n' && Respuesta[index-2]=='\n')
                     {
                        analisiscabecera();
                        index = 0;
                        memset (&Respuesta,0,500);                                           
                     }
                  else
                     {
                        index++;                                                               
                     }
               }
            else
               {
                  if (auxlec == false)
                     {
                                                           if (Lengthleida == Length)
                                                               {
                                                                   analisisdatos();
                                                                   Lectura = false;
                                                               }
                                                           else
                                                               {
                                                                   index++;
                                                                   Length++;
                                                               }
                     }
                  else
                     {
                        index++;
                     }
                                        }         
                                TimeReadPrevio = millis();                 
         }
      else
         {                         
                                TimeReadActual = millis();                       
                                if (TimeReadActual - TimeReadPrevio > TIMEOUT)
                                    {                                       
                                      Serial.println("El tiempo de espera se agoto");                               
                       Lectura = false;
                                    }
         }
   }
  Serial.println("Fin");
  delay(500);
  client.stop();
  client.flush();
    }
}

Alguien sabe porque esta parte del codigo hace que se clave el arduino?
Desde ya les agradezco su ayuda y si logro solucionar lo comento para que sea de ayuda para los que tengan algun problema similar.
Muchas gracias :)

perrociego

Hola:

Es muy difícil  leer solo parte del código, pero te aporto dos observaciones:
- "Respuesta[index-2]"  parece incorrecto, porque si index es 1 le pasas un numero negativo.
- Podes ganar memoria de proceso con la macro F. Si usas printl(F("cualquier texto")); es texto va en la memoria flash que es mas abundante.

Saludos.

mfcristaldo

tengo el mismo problema el server web anda bien  uno o dos días y despues se clava, la función f() que nombra perrociego anda de maravilla, aparentemente es un problema bastante frecuente y que no es del codigo de programa sino de la transmision entre el arduino y la placa 28j60, si lograste que funcione compartí la solucion, muchas gracias :smiley-confuse:  :smiley-confuse:

max_saeta

Saludos
Una forma que uso para la solución de este tipo de problemas es el perro guardián. He modificado los bootloaders de mis Arduinos para poder usar este método sin ningún problema.

Solo hago uso del watchdog cuando se que mi codigo esta correcto pero que por latencias de periféricos, como la ENC28J60 o la ESP8266, se puede quedar colgados, y solo cuando se va a entregar el proyecto.




Go Up