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);