Escritura y lectura de valores hexadecimales en un archivo de texto usando FatFs

Actualmente estoy trabajando en la placa de evaluación STM32F479. Tengo que recopilar datos de los nodos sensores y almacenarlos en un archivo de texto usando FatFs. Los valores de mi sensor están en valores hexadecimales. Estoy usando la biblioteca STM32F4Cube HAL que incluye FatFs. Estoy usando la función f_write() para pasar estos valores hexadecimales a un archivo de texto. Pero está almacenando como valores basura que no es como se esperaba. Cuando uso f_printf(), funciona perfectamente como se esperaba (los valores hexadecimales se almacenan). Pero al volver a leer, muestra algunos otros valores que no son los valores almacenados. Tengo dos preguntas.

  1. ¿Cuál es la manera perfecta de almacenar valores hexadecimales en un archivo de texto y leer lo mismo desde un archivo de texto usando FatFs?

  2. ¿Hay alguna otra forma de convertir estos valores hexadecimales a caracteres antes de pasarlos a un archivo y volver a convertirlos después de leer un archivo?

Mi código:

uint8_t Buff[]; // Buffer to read data from Sensors 

uint32_t byteswritten;

f_write(&MyFile,Buff,sizeof(Buff),(void*)byteswritten); //But writing some other values

for(i=0;i<sizeof(Buff);i++)
{
    f_printf(&MyFile,Buff[i]); //Writing properly But reading throws unexpected values
}
¿Estás leyendo el archivo, tokenizándolo y ejecutándolo a través de strtol()? ¿O simplemente está extrayendo el valor ASCII que ingresó en el archivo?
No sé a qué te refieres con 'maleficio'. ¿Quiere decir que el archivo se parece a "0d67f2a8569bc780", o "0d 67 f2 a8 56 9b c7 80", o "0x0d 0x67 0xf2 0xa8 0x56 0x9b 0xc7 0x80", o "0dh 67h f2h a8h 56h 9bh c7h 80h"? ¿Puede mostrarnos un poco de cómo se ve la salida "f_printf"? ¿Cómo se formatea Buff[] como hexadecimal? Me parece que solo está escribiendo los datos del sensor directamente sin ningún formato. ¿Están formateados los datos que provienen de los sensores?
Obtengo datos de nuestro propio chip (SoC) usando SPI. SPI está configurado como Recibir solo esclavo de 8 bits. Entonces mis datos se ven como "AA FF 80 12 A5 55". Sí, solo estoy extrayendo el valor ASCII que está relleno.

Respuestas (1)

Esta línea hace un puntero a partir de un valor aleatorio en la pila, solicitando una falla (difícil):

f_write(&MyFile,Buff,sizeof(Buff),(void*)byteswritten); 

El código correcto se vería así:

UINT byteswritten;
f_write(&MyFile,Buff,sizeof(Buff),&byteswritten);

Tenga en cuenta que f_write()escribe datos en binario en el archivo, no en hexadecimal.

Esa f_printf()línea debería darle una advertencia del compilador como "hacer un puntero a partir de un número entero sin conversión", porque espera una cadena (puntero a char) como segundo argumento.

Línea corregida para salida hexadecimal:

f_printf(&MyFile," %X",Buff[i]);
Gracias Turbo. Digamos que mis datos se ven como "AA FF AF FA 54 45", que está en la matriz Buff (uint8_t). Tengo que almacenarlo en un archivo de texto igual que (Hex) y volver a leerlo en otra matriz. ¿Cómo se puede implementar esto usando FatFs?
Intente ver cómo funcionan las operaciones básicas de archivos fread()en fwrite()una PC.