Problemas con un IF

Buenas compañer@s,

Tengo un problemilla que me está volviendo loco a ver si alguien por aquí le ha pasado algo similar o no y puede ayudarme. El caso es el siguiente tengo un código con una serie de funciones, entra las cuales se encuentra un socket de comunicación. A través de este socket mando unas trazas de mensajes que comienzan por "#" y terminan por "@". Por ejemplo "#19CP@".
El problema es que cuando me conecto a través del programita de visualBasic para acceder remotamente al Arduino y le mando un mensaje de estos que os comento me devuelve ERROR MENSAJE que como podéis ver en el código que os adjunto es lo que debe de mandar cuando el mensaje no es reconocido. Mi pregunta por tanto es: ¿Por qué no entra a mi IF? ¿Y lo que me inquieta más por qué a veces entra y otras no, y cuando no entra me deja colgado el Arduino y le tengo que hacer un RESET?
El código os lo adjunto en otro comentario que no me entra en este:

/***************************** FUNCION ENVIA MENSAJES */ 
int FEnviaMensaje()
{
  Serial.println("Enviando Message");
  int i=0;
  for (i = 0; i < gsMenEnviar.length() ; i++)
        server.write(gsMenEnviar[i]);
  Serial.println(gsMenEnviar);
  return 0;  
}
/***************************FUNCION TRATA MENSAJES */ 
int TrataMensajeRecibidoTCP()
{
   Serial.println("entro a funcion de trata de mensajes");
   int liRet = 0;
   int i=0;
   int liValor = 0;
   String lsAux = "";
   int liAddress = 0;
    gsMenEnviar = "#ERROR MENSAJE@";
   Serial.println("FEnviaMensaje");    
   if (gsMenRecibido[0] == '1' && gsMenRecibido[1] == '9')
   {
       if (gsMenRecibido[2] == 'S')
       {
            if (gsMenRecibido[3] == 'F')
            {
                  if (gsMenRecibido[4] == 'R')
                                 gsMenEnviar = "#RESETDEMANDAFIJAOK@"; 
                  else // Establece demandas fijas
                  {        
                      lsAux = String(gsMenRecibido[4]) + String(gsMenRecibido[5]) + String(gsMenRecibido[6]) + String(gsMenRecibido[7]);
                      giG1Dfijo = lsAux.toInt();
                      lsAux = String(gsMenRecibido[8]) + String(gsMenRecibido[9]) + String(gsMenRecibido[10]) + String(gsMenRecibido[11]);
                      giG2Dfijo = lsAux.toInt();
                      giIndDemandaFija = 1 ;
                      gsMenEnviar = "#DEMANDASFIJASOK@";
                    }    
            }
     }
     if (gsMenRecibido[2] == 'T')
     {
            if (gsMenRecibido[3] == 'S')
            {
                  lsAux = String(gsMenRecibido[4]) + String(gsMenRecibido[5]); 
                 day = lsAux.toInt();
                 lsAux = String(gsMenRecibido[7]) + String(gsMenRecibido[8]);
                 month = lsAux.toInt();
                 lsAux = String(gsMenRecibido[10]) + String(gsMenRecibido[11]) + String(gsMenRecibido[12]) + String(gsMenRecibido[13]);
                 year = lsAux.toInt();
                 lsAux = String(gsMenRecibido[15]) + String(gsMenRecibido[16]);
                 hour = lsAux.toInt();
                 lsAux = String(gsMenRecibido[18]) + String(gsMenRecibido[19]);
                 min = lsAux.toInt();
                 lsAux = String(gsMenRecibido[21]) + String(gsMenRecibido[22]);
                 second = lsAux.toInt();
                 RTC.adjust(DateTime(year, month, day, hour, min, second));
          }
       Serial.println("-" + gsMenEnviar + "-");
      gsMenEnviar = String("#T" + String(now.month()) + "-" + String((int)now.day()) + " H:" + String((int)now.hour()) + ":" + String((int)now.minute()) + ":" + String((int)now.second())+ "@");
      Serial.print("-" + gsMenEnviar + "-");
      Serial.println();
    }    
    if (gsMenRecibido[2] == 'D') 
    {
        if (gsMenRecibido[3] == 'D')
            gsMenEnviar = "#DD" + String(giG1D) + "," + String(giG2D)+ "@";
        else
        {     
             gsMenEnviar = "#DR";
             for(i=0 ; i < 5; i++)
                  gsMenEnviar += String(giValActualG1[i]) + "," + String(giValActualG2[i]) + ",";
             gsMenEnviar += "@";
        }
    } 
   if (gsMenRecibido[2] == 'C')
   {
         if (gsMenRecibido[3] == 'P')
         {
             giIndCalibrando = 1;
             if (giIndCalibrando == 1)
             {
                 for (p=0; p<5; p++)
                 {
                     digitalWrite(giPinSeguidorG1[p], LOW);
                     digitalWrite(giPinSeguidorG2[p], LOW);
                 }
                 digitalWrite(PinAccionG1, LOW);
                 digitalWrite(PinSentidoG1, LOW);
                 digitalWrite(PinSentidoG2, LOW);
            }     
           gsMenEnviar = "#CALIBRANDO@"; 
         }
         else if (gsMenRecibido[3] == 'A')
         {
                gsMenEnviar = "#CA";
                for (i=0; i < 5; i++)
                {
                    giValActualG100[i] = TransAnGra(giEAnalogicasG1[i], 1, 0, i, 1);
                    giValActualG200[i] = TransAnGra(giEAnalogicasG2[i], 1, 0, i, 2);
                    gsMenEnviar += String(giValActualG100[i]) + "," + String(giValActualG200[i]) + ",";
                }
                gsMenEnviar += "@";
         }
         else if (gsMenRecibido[3] == 'B')
         {        
                lsAux = String(gsMenRecibido[4]) + String(gsMenRecibido[5]);  
                liValor = lsAux.toInt();
                Serial.println(String(liValor));
                gsMenEnviar = "#CB";
                for (i=0; i < 5; i++)
                {
                    giValActualG1XX[i] = TransAnGra(giEAnalogicasG1[i], 1, 0, i, 1);
                    gdPendienteG1[i] = (double)liValor / (double)(giValActualG1XX[i] - giValActualG100[i]) ;
                    giOffSetG1[i] = - (gdPendienteG1[i] * giValActualG100[i]);
                    gsMenEnviar += String(giValActualG1XX[i]) + "," + String((int)gdPendienteG1[i]) + "," + String(giOffSetG1[i]) + ",";
                }
                gsMenEnviar += "@";
         }
         else if (gsMenRecibido[3] == 'C')
         {        
                lsAux = String(gsMenRecibido[4]) + String(gsMenRecibido[5]);                
                liValor = lsAux.toInt();
                gsMenEnviar = "#CC";
                for (i=0; i < 5; i++)
                {
                    giValActualG2XX[i] = TransAnGra(giEAnalogicasG2[i], 1, 0, i, 2);
                    gdPendienteG2[i] = (double)liValor / (double)(giValActualG2XX[i] - giValActualG200[i]) ;
                    giOffSetG2[i] = - (gdPendienteG2[i] * giValActualG200[i]);
                    gsMenEnviar += String(giValActualG2XX[i]) + "," + String((int)gdPendienteG2[i]) + "," + String(giOffSetG2[i]) + ",";
                }
                gsMenEnviar += "@";
         }
         else if (gsMenRecibido[3] == 'I')
         {
                  gsMenEnviar = "#CI";
                  for (i=0; i < 5; i++)
                  {
                        giValActualG1[i] = TransAnGra(giEAnalogicasG1[i], gdPendienteG1[i], giOffSetG1[i], i, 1);
                        gsMenEnviar += String(giValActualG1[i]) + "=(";
                        liValor = TransAnGra(giEAnalogicasG1[i], 1, 0, i, 1);
                        gsMenEnviar += String(liValor) + "*" + String((int)gdPendienteG1[i]) + ")+" + String(giOffSetG1[i]) + ";";
                        giValActualG2[i] = TransAnGra(giEAnalogicasG2[i], gdPendienteG2[i], giOffSetG2[i], i, 2);
                        gsMenEnviar += String(giValActualG2[i]) + "=(";
                        liValor = TransAnGra(giEAnalogicasG2[i], 1, 0, i, 2);
                        gsMenEnviar += String(liValor) + "*" + String((int)gdPendienteG2[i]) + ")+" + String(giOffSetG2[i]) + ";";
                  }
                  gsMenEnviar += "@";
         }      
         else if (gsMenRecibido[3] == 'S')
         {
             EEPROM.writeInt(giAddress, 1);
             giIndCalibrado = 1;
             for (i=0; i<5 ; i++)
             {
                  EEPROM.writeFloat(giAddress+1+(i*12), gdPendienteG1[i]);
                  EEPROM.writeFloat(giAddress+5+(i*12), gdPendienteG2[i]);
                  EEPROM.writeInt(giAddress+9+(i*12), giOffSetG1[i]);
                  EEPROM.writeInt(giAddress+11+(i*12), giOffSetG2[i]);
              }         
              gsMenEnviar = "#EEPROMOK@"; 
              giIndCalibrando = 0;
         }      
     }       
  }
  else
  {
     liRet = -1;
  }
  FEnviaMensaje();
  return liRet;  
}
/************************ FUNCION ATIENDE PETICIONES*/ 
int FAtiendePeticionesTCP()
{
  int liRet = 0;
  char c ;  
  gsMenRecibido="";
  EthernetClient client = server.available(); 
  if (client)
  {
    if (client.connected()) 
    {
          Serial.println("cliente conectado");
          while ((client.available()) ) 
          {      
              c = client.read();        
              if (c == '#') 
              {
                gsMenRecibido = "";
                Serial.println("mensaje: #");          
              }
              else if ( c == '@')
              {
                liRet = TrataMensajeRecibidoTCP();
                Serial.println("mensaje: " + gsMenRecibido);          
                client.flush();
                client.stop();
              }
              else 
              {
                gsMenRecibido+=c;//store the recieved chracters in a string      
              }
          }
    } 
  }
  return liRet;
}

no sera que te has quedado sin memoria ram; dices que remotamente, te refieres a que estas utilizando un modulo como interface y que este te proporciona la comodidad de tener el arduino retirado.

tengo dudas que tipo de interface estas manejando?
he leído en el foro que el arduino se queda corto de memoria ram al conectarlo a la red, en algunos casos claro, y el cuelgue se debe a desbordamiento de datos en la ram.

Hola ehrja!!

No era un mismo problema que estuviera repetido. Eran dos problemas distintos. Los cuales ya solucioné. Y como siempre los solucioné solo porque este foro de poco vale.
Sin embargo te agradezco la aportación de los byte, aunque no la he usado, tengo memoria de sobra y no se me cuelga. Con el Arduino Uno que mencionas no tengo ni para empezar, es muy corto para mi código. Aqui solo has visto un fragmento pero el codigo es mucho pero mucho mayor.

De todas formas gracias por interesarte.

querido compañero
MiguelLopez

no creo que el foro no sirva si no que no todos pueden responder a todas tus preguntas me ah pasado a mi y hay veces que hay que insistir un poco mas pero siempre estan los camaradas con los que podes conversar y te ayudan con tu codigo solo hay que tener paciencia !
me alegra que puedas solucionar tu problema :slight_smile:

A mi también me pasa a veces, supongo que tampoco conozco a nadie, pero no pasa nada, si lo has solucionado por ti mismo es doble exito, yo pregunto en el foro en inglés también, porque cuando me busco la vida me encuentro más recursos en ese idioma, algo normal porque hay más diversificación en la información. Hay que tener paciencia.

A veces me acuerdo de cuando querias solucionar algo y tenias que ir a la biblioteca del pueblo (LOL), es impresionante como ya nos hemos habituado al aquí y ahora en las respuestas de internet, aunque muchas, a veces entorpecen más que ayudan.

Hola MiguelLopez

Lo que dicen los compañeros es verdad y tristemente en ocasiones el foro en Español se queda muy solo, quizás por eso me he tomado el atrevimiento de andar de moderador no oficial pues para ayudar a enfocar el mensaje para beneficio de todos, y discúlpame que no haya entendido muy bien la diferencia de tus dos inquietudes, de verdad, solo buscaba ayudar y por las prisas, al ver lo que parecía obvio, te conteste mal.

Que bueno que al menos lo de los bytes te ha sido útil.

Por otro lado también tu podrías ayudar a este foro compartiendo tus ideas y soluciones, con el fin de que el foro no se quede solo y la comunidad crezca firmemente gracias al compañerismo y la camaradería, que por cierto tiene y le hace falta al foro en español.

Saludos Amigos.