Necesito ayuda

Alguien me puede decir, porque si con el código adjunto introduzco el mensaje #19T@ todo va correcto y si intriduzco cualquier otro mensaje #19xx@ se para la ejecución del programa? He observado que parece ser que con la variable gsMenEnviar no funciona bien, es como si no recogiera los valores y por lo tanto se queda colgado el proceso en esas instrucciones, sin embargo como digo, con #19T@ que a mi entender lo trato igual que lo demas va todo correcto... Alguien sabe ayudarme?? Gracias
P.D.: el código va en el mensaje siguiente que aquí no me entra...

#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>   // Incluye la libreria Wire
#include "RTClib.h" // Incluye la libreria RTClib
#include <EEPROMEx.h>
#include <math.h>
int giG1D;
int giG2D;
byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0xB7, 0xC7 };
IPAddress ip(192,168,0, 5);
int serverPort=60;
RTC_DS1307 RTC; 
DateTime now;
int year =2013;
int month =0;
int day =0;
int hour =0;
int min =0;
int second =0;
const int giPinA[5] = {36, 32, 31, 30, 33}; 
int PinSA1 = 48;
int PinAA1 = 45; 
const int giPinB[5] = {38, 37, 39, 42, 41}; 
int PinSB2 = 47;
const int giEAnalogicasG1[5]= {0, 1, 2, 3, 4};
const int giEAnalogicasG2[5] = {5, 6, 7, 8, 9}; 
int giValActualG1[5];
int giValActualG2[5];
int giValActualG100[5];
int giValActualG200[5];
int giValActualG1XX[5];
int giValActualG2XX[5];
double gdPendienteG1[5];
double gdPendienteG2[5];
int giOffSetG1[5];
int giOffSetG2[5];
int giIndCalibrando =0;
int giIndCalibrado =0;
int giComodinfor=1;
int giAddress = 0;
int giPosEntrada = 0;
double gdAuxG1 [5][5]; 
double gdAuxG2 [5][5];
int p; 
String gsMenRecibido="";
String gsMenEnviar="";
EthernetServer server(serverPort);
void setup()
{
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  Wire.begin();
  RTC.begin();
  server.begin();
  pinMode(PinSA1, OUTPUT);
  pinMode(PinAA1, OUTPUT); 
  pinMode(PinSB2, OUTPUT); 
  for(p=0;p<5;p++)
  {
     pinMode(giPinA[p], OUTPUT);
     pinMode(giPinB[p], OUTPUT); 
     giIndCalibrado = EEPROM.readInt(giAddress);
    if (giIndCalibrado == 1)
     {
       gdPendienteG1[p] = EEPROM.readFloat(giAddress+1+(p*12));
       gdPendienteG2[p] = EEPROM.readFloat(giAddress+5+(p*12));
       giOffSetG1[p] = EEPROM.readInt(giAddress+9+(p*12));
       giOffSetG2[p] = EEPROM.readInt(giAddress+11+(p*12));
     }
     else 
     {
       gdPendienteG1[p] = 1; //valores sin ajustar
       gdPendienteG2[p] = 1; //valores sin ajustar
       giOffSetG1[p] = 0;     
       giOffSetG2[p] = 0;     
     }
  }
}
/************************************* FUNCION TRANSFORMA ANGULOS EN GRADOS *****************************/ 
int TransAnGra(int EntradaRec, double pdPendiente, int piOffset, int I, int E)
{ 
  double ldXG1 = 0;
  double ldXG2 = 0;
  double ldValor;
  int valor;
   if (pdPendiente ==  1 && piOffset == 0)
      ldValor = analogRead(EntradaRec); 
   else
   {
    if (E == 1) 
    {
      gdAuxG1 [I][giPosEntrada] = analogRead(EntradaRec); 
      giPosEntrada++;  
      if(giPosEntrada == 4) 
        giPosEntrada = 0;  
      for (p=0; p<5; p++)
        ldXG1= ldXG1 + gdAuxG1 [I][p]; 
      ldXG1= ldXG1 / 5;  
      ldValor  = ldXG1;  
    }
    else if (E ==2) 
    {
      gdAuxG2 [I][giPosEntrada] = analogRead(EntradaRec);
      giPosEntrada++;  
      if(giPosEntrada == 4)
        giPosEntrada = 0; 
      for (p=0; p<5; p++)
        ldXG2= ldXG2 + gdAuxG2 [I][p];    
      ldXG2= ldXG2 / 5;  
      ldValor = ldXG2;
    }
  }
  valor =(int)((ldValor* pdPendiente) + piOffset); 
  Serial.println (valor);
  return valor;
}
/**************************************** FUNCION ITERACCIONA CON LOS INCLINOMETROS*******************************/ 
int FRecuperaValoresInclinometros()
{
  for(p=0;p<5; p++) 
  {
      giValActualG1[p] = TransAnGra(giEAnalogicasG1[p], gdPendienteG1[p], giOffSetG1[p], p, 1);   
      giValActualG2[p] = TransAnGra(giEAnalogicasG2[p], gdPendienteG2[p], giOffSetG2[p], p, 2);   
  } 
  if(giComodinfor)
      giComodinfor=0;
  return 0;
}
/***************************************** FUNCION ENVIA MENSAJES ***********************************************/ 
int FEnviaMensaje()
{
  Serial.println("Enviando Message");
  int i=0;
  server.print(gsMenEnviar);
  Serial.println(gsMenEnviar);
  return 0;  
}
[\code]
[code]
/********************************************** 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;
  Serial.println("FEnviaMensaje");  
    if (gsMenRecibido[0] == '1' && gsMenRecibido[1] == '9')
    {
      if (gsMenRecibido[2] == 'S') 
      {
         if (gsMenRecibido[3] == 'F') 
         {
              if (gsMenRecibido[4] == 'R') 
              {
                     gsMenEnviar = "#RESET@"; 
              }
              else
              {        
                  gsMenEnviar = "#RESET OK@";
              }    
         }
     }
     if (gsMenRecibido[2] == 'T') 
     {
        if (gsMenRecibido[3] == 'S') 
        {
          gsMenEnviar = "#SETEO HORA@";
        }
        else
        {
           gsMenEnviar = "#SUMINISTRANDO HORA@";
        }
    }
    if (gsMenRecibido[2] == 'D') 
    {
        if (gsMenRecibido[3] == 'D') 
        {
            gsMenEnviar = "#PREGUNTO INFO@";
        }
        else
        {     
              gsMenEnviar = "#DR@";
        }
    }  
   if (gsMenRecibido[2] == 'C') 
   {
         if (gsMenRecibido[3] == 'P')
         {
             giIndCalibrando = 1;
             if (giIndCalibrando == 1) 
             {
                 for (p=0; p<5; p++)
                 {
                     digitalWrite(giPinA[p], LOW);
                     digitalWrite(giPinB[p], LOW);
                 }
                 digitalWrite(PinAA1, LOW);
                 digitalWrite(PinSA1, LOW);
                 digitalWrite(PinSB2, LOW);
            }     
           gsMenEnviar = "#CALIBRANDO@"; 
         }
         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]) + ",";
                     Serial.println (gsMenEnviar);
                }
                Serial.println ("FIN");
                gsMenEnviar += "@";
         }
         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 += "@";
         }
         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 += "@";
         }
         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 += "@";
         }      
         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
  {
     gsMenEnviar = "#ERROR MENSAJE@";
     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;                     
              }
          }
    } 
  }
  return liRet;
}
/*************************** FUNCION PRINCIPAL O "MAIN" *************************************************************/ 
void loop()
{
  int liRet = 0; 
  if (giIndCalibrando == 0)  // Si no se para remotamente, el programa continua su flujo
  {
    liRet = FRecuperaValoresInclinometros();
  }
  liRet = FAtiendePeticionesTCP();
}

[/code]

Dejame darte un par de consejos...

1.-No repitas las mismas cosas en dos hilos diferentes en el mismo foro, que sentido tiene eso; no lo verán mas personas por estar repetido.
2.-Ten en cuenta que los detalles técnicos, la claridad de el tema y el problema llamara la atención de las personas indicadas, un titulo como Necesito ayuda no le dice nada al que podría resolver tu problema; también valdría la pena incluir que módulos estas utilizando, que placa arduino tienes y como estas cableando.

Lo que te puedo decir respecto al código es que utilizas variables tipo int y que caben perfectamente en variables tipo byte y en este caso conviene ahorrar memoria ram para evitar un desbordamiento.

una variable tipo byte puede almacenar un número entero sin signo de 0 a 255(un byte).
una variable tipo int puede almacenar un entero positivo o negativo de -32,768 to 32,767(dos bytes en el uno);