stm32f4 fatfs f_write whitemarks

时间:2017-11-25 20:16:10

标签: stm32 fatfs

我在stm32f4上与fatfs挣扎。没问题我可以挂载,创建文件并通过以下方式写入:char my_data[]="hello world"并且在Windows文件中显示正常但是当我尝试使用代码作为loger时:

float bmp180Pressure=1000.1;
char presur_1[6];//bufor znakow do konwersji
sprintf(presur_1,"%0.1f",bmp180Pressure);
char new_line[]="\n\r";

if(f_mount(&myFat, SDPath, 1)== FR_OK)
{
    f_open(&myFile, "dane.txt", FA_READ|FA_WRITE); 
    f_lseek(&myFile, f_size(&myFile));//sets end of data
    f_write(&myFile, presur_1, 6, &byteCount);
    f_write(&myFile, new_line,4, &byteCount);
    f_close(&myFile);
    HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_15);
}

当我从电脑上阅读时,我有:top : notepad ++ buttom :windows notepad

1 个答案:

答案 0 :(得分:0)

您的代码中至少存在两个问题:

该数字的字符串太短。 C字符串以空字节终止。所以presur_1需要至少7个字节长(数字为6,空字节为1)。由于它只有6个字节长,sprintf将写入超出分配的长度并销毁其他一些数据。

使用2个字符的字符串(加上空字节)初始化换行符的字符串。但是,您将4个字符写入该文件。因此,除了换行符之外,NUL字符和垃圾字节将最终出现在文件中。

固定代码如下所示:

float bmp180Pressure = 1000.1;
char presur_1[20];//bufor znakow do konwersji
int presur_1_len = sprintf(presur_1,"%0.1f\n\r",bmp180Pressure);

if(f_mount(&myFat, SDPath, 1)== FR_OK)
{
    f_open(&myFile, "dane.txt", FA_READ|FA_WRITE); 
    f_lseek(&myFile, f_size(&myFile));//sets end of data
    f_write(&myFile, presur_1, presur_1_len, &byteCount);
    f_close(&myFile);
    HAL_GPIO_TogglePin(GPIOD, GPIO_PIN_15);
}