Problema concatenando arreglos de caracteres

Hola a todos,
soy principiante en programación de Arduino, usando Arduino IDE.
Tengo el siguiente problema creando un archivo cuyo nombre sea el resultado de unir un código alfanumérico leido de una etiqueta RFID con la fecha.
Uso arreglo de carateres pues para generar la parte del nombre correspondiente a la fecha uso la función"sprintf()", con los datos de un RTC.
Para concatenar ambos arreglos uso un Loop For.
Aparentente todo funciona y se genera el nombre correctamente, sinembargo al tratar de crear el archivo con dicho nombre este sólo queda con la parte correspondiente al primer arreglo que contiene el código de la etiqueta e ignora la parte de la fecha.
Descubrí que la cadena de caracteres del código leído de la etiqueta RFID contiene al final un CR que no he podido quitarlo y no se de dónde aparece.
Intuyo que si uso Strings la concatenación puede funcionar, pero no lo he logrado
Sabe alguien cómo hacerlo con Strings? Existe una función similar a sprintf que use un String y no una cadena de caracteres?

Aqui la función en donde estoy haciendo lo anterior. "Tag" es un arreglo de caracteres char Tag[8] que defino como variable global.

void callback_function(esp_spp_cb_event_t event, esp_spp_cb_param_t *param) {
  if (event == ESP_SPP_START_EVT) {

    Serial.println("Inicializado SPP");
  }
  else if (event == ESP_SPP_SRV_OPEN_EVT ) {
    Serial.println("Cliente conectado");
    digitalWrite(ledWrite,HIGH);    
  }
  else if (event == ESP_SPP_CLOSE_EVT  ) {
    Serial.println("Cliente desconectado");
    digitalWrite(ledWrite,LOW);  
  }
  else if (event == ESP_SPP_DATA_IND_EVT ) {
    char c;
    int i=0;
    while (BT.available()) // Mientras haya datos por recibir
    { c = BT.read();
      if(c != '#'){
        Tag+=c;
        i++;
      }
    }
    int len;
    len = i

    char filenameExt[40];
    filenameExt[0]= '/';
    for (int i=1; i<len; i++)
    {
        filenameExt[i]=Tag[i-1];  
   
    }

        
    Serial.print("Recibido: ");
     
    DateTime now = rtc.now();
 
    sprintf(filename,"_%4d-%02d-%02d %02d_%02d_%02d.csv",now.year(),now.month(),now.day(),now.hour(),now.minute(),now.second());

    for (int i=0; i<=25; i++)
    {
        filenameExt[i+len]=filename[i];
    }

    checkFile(SD, filenameExt);  //esta función crea el archivo con nombre "filenameExt"

  }
}

Has publicado todo bien respecto al código usando etiquetas, sin embargo no se ve todo el código. Y por qué es improtante? porque no sabemos las dimensiones de filenameExt
Asi que cuando consultes, siempre postea todo el código porque no basta con lo que tu crees que esta mal o esta fallando ya que por esa misma razón no puedes resolverlo. Nosotros debemos ver siempre todo el panorama.
Agrega en otro post todo el código.

Otra cosa. Tu variable filename tiene 40 bytes de longitud. Usas una variable len que no sabemos cuanto vale. Pasas valores de 0 a 24.
Cuando usas comandos como sprintf y strings la forma de concatenarlos es usando strcpy pero eso para pasar una cadena a otra de igual longitud.
En este caso necesitas, strncpy que copia 1 a la otra a partir del indice.
La función strncpy() copia los caracteres del string2 en el string1. Si el recuento es menor o igual que la longitud de string2, un carácter nulo (\0) no se añade a la serie copiada.
Si el recuento es mayor que la longitud de string2, el resultado de string1 se rellena con caracteres nulos (\0) hasta la longitud recuento.

Entonces usa

strncpy(filanameExt, filename, len);

Hola Surbyte,
mil gracias por tu respuesta.
Realmente el código es muy largo (1,185 líneas). por eso tomé sólo la parte en la que estoy teniendo problemas.
Logré solucionar el problema un poco picapiedra. Al leer el código filtro caracteres CR y LF (ASCII 10 y 13) así:

    char c;
    int i=0;
    while (BT.available()) // Mientras haya datos por recibir
    { c = BT.read();
      if(c != '#'){
        if(c != 13 && c != 10){
        molde[i]+=c;
        i++;
        }
      }
    }
    len = i;

El código a leer termina en "#". Lo hice para no leer de pronto algo más que no me interesa.
Voy a ensayar lo que me dices, pues realmente no lo conocía y de pronto logro hacer algo más limpio.
De nuevo mil gracias.

Debo cerrar este asunto?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.