La forma más cuidadosa de concatenar cadenas en C

-1

Mi firmware en un ciclo por 10 segundos está moviendo la cadena a la salida (archivo csv en la tarjeta SD). El problema es que la cadena a veces de forma no determinista está cambiando agregando valores que no deberían estar allí o poner espacio en el medio. ¿Está esto relacionado con la función sprintf o la memoria dinámica asignada para esa cadena?

Editar: estoy adjuntando código

void archPolling()
{

 double archCountVal[200];
 float archDataVal[100];
 char *FilStringMeas = malloc(sizeof(char) * 2048);
 char *FilArchive = malloc(sizeof(char) * 4096);
 vArchEvent eventArch = STATE_POLLING;
 unsigned char CiphCRC[5];
 FIL FilData;
 UINT bw;
 int queueSize = 0;

 if ( xSemaphoreTake( MutexMeasurment, 200 ) == pdTRUE)
 {
  eventArch = STATE_COLLECT;
 }

 if (eventArch == STATE_COLLECT)
 {

  while (uxQueueMessagesWaiting(xDataQueue) > 0)
  {
   xQueueReceive(xDataQueue, &archDataVal[queueSize], 0);
   queueSize++;
  }
  xSemaphoreGive(MutexMeasurment);

  if (queueSize > 0 && timerFlag == 1)
   eventArch = STATE_FORM;
  else
   eventArch = STATE_POLLING;
 }

 if (eventArch == STATE_FORM)
 {
  //portENTER_CRITICAL();
  HAL_RTC_GetTime(&RtcHandle, &RTCTimeArch, FORMAT_BIN);
  HAL_RTC_GetDate(&RtcHandle, &RTCDateArch, FORMAT_BIN);
  sprintf(FilArchive, "%02d-%02d-%02d,%02d:%02d:%02d,1", RTCDateArch.Date, RTCDateArch.Month, RTCDateArch.Year, RTCTimeArch.Hours, RTCTimeArch.Minutes, RTCTimeArch.Seconds);
  sprintf(FilStringMeas, ",");
  for (int i = 0; i < queueSize; i++)
  {
   sprintf(FilStringMeas, "%s%f,", FilStringMeas, archDataVal[i]);
  }

  strcat(FilArchive, FilStringMeas);
  archCRC((BYTE *) FilArchive, strlen(FilArchive), CiphCRC);
  strcat(FilArchive, (char *) CiphCRC);
  strcat(FilArchive, "\n");
  //portEXIT_CRITICAL();
  eventArch = STATE_SYNC;
 }

 if (eventArch == STATE_SYNC)
 {
  f_open(&FilData, "0:55AD001.csv", FA_OPEN_EXISTING | FA_WRITE);
  f_lseek(&FilData, f_size(&FilData));
  f_write(&FilData, FilArchive, strlen(FilArchive) * sizeof(char), &bw);
  f_close(&FilData);
  timerFlag = 0;
  eventArch = STATE_POLLING;
 }

 free(FilStringMeas);
 free(FilArchive);
}
    
pregunta m0drzew

1 respuesta

0

Resolví el problema, que no estaba asociado con las cadenas concatenadas, pero con la función responsable de guardar la cadena en el archivo. Estaba usando f_write cuando debería f_printf .

    
respondido por el m0drzew

Lea otras preguntas en las etiquetas