Problema al concatenar (concat o +=) Strings

Hola a todos.

Previamente a exponer mi problema he buscado por los foros a ver si encontraba la solución, y lo único más parecido a mi situación ha sido este hilo Problema concatenando Strings - Español - Arduino Forum, el cual es algo antiguo y tampoco aporta solución

Estoy trabajando con Arduino Uno R3 y tengo problemas al unir varios Strings mediante concat, o utilizando +=.

El código que utilizo es el siguiente:

void enviarpeticion()
{
  Serial.println(F("enviarpeticion"));
  // convierte el dato cifrado en cadena de caracteres y construye la petición
  
  tiempopet = millis();

  String request, sdatodif0, sdatodif1, sdatodif2, sdatodif3, sdatocif;
  request = "GET /temperatura.php?temp=";
  if (h==1)
      {
//      sdatodif0 = String(datocif[0]);
//      sdatodif1 = String(datocif[1]);
//      sdatodif2 = String(datocif[2]);
//      sdatodif3 = String(datocif[3]);
        for (int i=0; i<4; i++) {
          request += String(datocif[i]); 
        }
//      request = "GET /temperatura.php?temp=" + sdatodif0 + sdatodif1 + sdatodif2 + sdatodif3 + " HTTP/1.1";
       } else {
          if (h==10) {
            ind=0;
            for (int i=0; i<10; i++) {
            for (int j=0; j<4; j++) {
            //Serial.print("dato: ");
            //Serial.print(i);
            //Serial.print(",");
            //Serial.print(j);
            //Serial.print(": ");
            //Serial.println(matrizdatoscif[i][j]);
            sdatocif.concat(matrizdatoscif[i][j]);
            //sdatocif += matrizdatoscif[i][j];
             }   
            }
           Serial.print("sdatocif: ");
           Serial.println(sdatocif);  
           //request +=  sdatocif;
           request.concat(sdatocif);
           }
         }
  //request += " HTTP/1.1";   
  request.concat(" HTTP/1.1");
  
  Serial.print("peticion: ");
  Serial.println(request);  
  Serial.print("Content-Length: ");
  Serial.println(request.length());    
  
  String host = "Host: " + String(site);
  String client = "User-Agent: " + User_Agent;

  wifly.print(request);
  wifly.print("\r\n");
  wifly.print(host);
  wifly.print("\r\n");
  wifly.print(client);
  wifly.print("\r\n");
  wifly.print("Content-Type: text/html; charset=utf-8");
  wifly.print("\r\n");
  wifly.print("Content-Length: ");
  wifly.print(request.length());
  wifly.print("\r\n");
  wifly.print("Connection: close");
  wifly.print("\r\n");
  wifly.print("\r\n");
  //Tiempo que tarda en construir la petición y enviarla al servidor
  tiempopet = millis() - tiempopet;
  n = n + 1;
  Serial.println(request);
//tiempopet representa el tiempo que se tarda en construir la petición y enviarla hacia el servidor
//Habría que tener en cuenta el tiempo que se tarda desde que Arduino envía la petición hasta que le llega al servidor.
//Esto no ha sido posible calcularlo al no tener una única referencia de tiempos (sincronismo) en la parte del cliente (Arduino) y del servidor (Apache)

}

En el que matrizdatoscif está definida como:

int matrizdatoscif[10][4]; // matriz de 10 datos cifrados

En este caso el programa está pasando por: else {if (h==10).

Y el resultado que obtengo en el monitor serie es el siguiente:

enviarpeticion
sdatocif: -6562627616784-2936831184-30198-10882-24012-246811236-14430-6034-7042-13581456719204-28170-3856-2657-319285072-1189430606-194047900-7708-130063950-7042-13581456719204-28170-3856-2657-319285072-1189430606-19404
peticion: GET /temperatura.php?temp= HTTP/1.1
Content-Length: 35
GET /temperatura.php?temp= HTTP/1.1

donde se puede ver claramente el contenido de la variable sdatocif, y el contenido de la variable request (lo que le impreso después de petición:)

El resultado después de ejecutarlo mediante concat o mediante el operador += es el mismo: no concatena el valor de la variable sdatocif.

¿Alguien sería tan amable de darme una pista acerca de la posible solución a este error?

Saludos.

no has puesto todo el código pero me pregunto: No te estarás quedando sin RAM?
Hay una rutina que puedes usar para ver el nivel de SRAM disponible
Availabel Memory
solo es una corazonada, prueba a ver si estas bien.
Si no vemos que puede andar mal.
Usar demasiados Strings y no poniéndolos luego a cero puedo traer problemas.

Buenos días, en primer lugar gracias por la pronta respuesta.

El código entero del programa es el del archivo adjunto, ya que no lo pude incluir en el mensaje porque excedía el máximo de caracteres permitido.

En el que utilizo la función wifly.getFreeMemory() y en la salida por el monitor serie aparece lo siguiente:

IDEA v3. Memoria libre: 695
conectarredWIFI
Anteriormente conectado a la red WIFI
cerrarconexionServidor
Antigua conexión activa. Cerrando
close: failed, no *CLOS*
open 192.168.1.10 80
Conectado al servidor 192.168.1.10
recogerdato
cifrardatoIDEA
almacenardato
dato almacenado: 9,0: 31184
dato almacenado: 9,1: -30198
dato almacenado: 9,2: -10882
dato almacenado: 9,3: -24012
enviarpeticion
sdatocif: 139589168-1128926696-13872-14198-20546-3220425180-18460-8926-29586-26178-16078-21225-21372-28170-3856-2657-3192831184-30198-10882-2401225180-18460-8926-29586-32066-171021595928292-28170-3856-2657-3192831184-30198-10882-24012
peticion: GET /temperatura.php?temp= HTTP/1.1
Content-Length: 35
GET /temperatura.php?temp= HTTP/1.1
7 envíos
 T toma: 1
 T cif: 126
 T pet: 192
 T giro: 1448

en que me dice que la memoria disponible son 695 bytes.

¿Sería esta cantidad insuficiente?

IDEA_V3.txt (14.5 KB)

Usar variables String de ese modo no es aconsejable. La memoria del Arduino es limitada y además suele estar fragmentada, de modo que no todas las variables String que has definido tienes longitudes como lo que necesitas.
La prueba esta en lo que esta ocurriendo.
Deberías intentar de otro modo dejame ver y te sugiero algo a menos que me ganen con la respuesta.

Es posible que sea eso que comentas, porque cuando se ejecuta el programa por el lado del if (h==1), en ningún momento he tenido problemas, ya que los String utilizados para construir la petición (variable request) son considerablemente más cortos.

Gracias de nuevo.

Utiliza la función sprinf para construir la cadena. No es muy elegante, pero esta en la librería estandar y no gasta memoria en clases externas , acotas el tamaño del vector a los caracteres que necesites .

Saludos

Gracias, PeterKantTropus, lo intentaré.

Saludos.

prueba con esto, pero requiere que delimites cada cadena
strcat suma cadenas

char str1[32];
char str2[10];

strcpy (str1, "hola");
strcpy (str1, " mundo");
strcat (str1, str2);
//resultado en str1 "hola mundo"

Si no funciona agrega a str2[9] = '\0';

Otra opción mejorada de esta es

char bigstring[40];  // con sufiente espacio para los dos strings a sumar

char* join3Strings(char* string1, char* string2) {
 bigstring[0] = 0;          // start with a null string:
 strcat(bigstring, string1);   // agrega el primer string
 strcat(bigstring, string2);  // agerga el segundo string

 return bigstring;
}