针对正点原子STM32战舰视频第76讲SD卡写入数据乱码纠正

针对正点原子STM32战舰视频第76讲SD卡写入数据乱码纠正

针对正点原子在视频中进行了FATFS视频的调整,其中补充以下的代码,纠正乱码问题
变量声明部分:

FIL fil;
FRESULT res;
UINT bww;
char buf[100];

主程序中添加以下代码

 res=f_open (&fil,"0:/message.txt", FA_OPEN_ALWAYS|FA_WRITE);   
 f_write (&fil, "alientek test", 50, &bww);
 f_close(&fil);

正点原子系统SHELL代码

list
mf_scan_files("0:");
mf_open("0:/fgg.txt",0x01);
mf_read(100);
mf_close();

图片如下:
针对正点原子STM32战舰视频第76讲SD卡写入数据乱码纠正_第1张图片
输出结果如下:
针对正点原子STM32战舰视频第76讲SD卡写入数据乱码纠正_第2张图片

针对正点原子STM32战舰视频第76讲SD卡写入数据乱码纠正_第3张图片
通过调试,目前发现有两种更改方法:
(1)
F_write 中长度输入字符串实际长度,即

 f_write (&fil, "alientek test", 10, &bww);

(2)
使用siziof函数

res=f_open (&fil,"0:/fgg.txt", FA_CREATE_ALWAYS|FA_WRITE);
f_write(&fil,"HELLOWORLD",sizeof("HELLOWORD"),&bww);
f_close(&fil);

输出结果如下:
针对正点原子STM32战舰视频第76讲SD卡写入数据乱码纠正_第4张图片
针对正点原子STM32战舰视频第76讲SD卡写入数据乱码纠正_第5张图片
补充20200912
补充:
摘自网址:
[资料] FATFS系统中的f_write的用法总结
https://bbs.elecfans.com/jishu_445988_1_1.html
学习fatfs文件系统的时候发现,运行一段代码无论使用f_write写多少次,串口总是输出第一次写的数据,后面再次写的都没有出现,代码如下:

BYTE textFileBuffer[] = "Welcome";
  f_mount(0,&fs);
 /* Create new file on the drive 0 */
 res = f_open(&fnew, "0:newfile2.txt",FA_OPEN_ALWAYS | FA_WRITE );         
 if( res == FR_OK )
 {
     
      f_lseek(&fnew,fnew.fsize);
      res = f_write(&fnew, textFileBuffer, sizeof(textFileBuffer), &bw);
      f_close(&fnew);      
 }
res = f_open(&fnew, "0:newfile.txt", FA_OPEN_EXIStiNG | FA_READ);
res = f_read(&fnew, buffer, sizeof(buffer), &br); 
printf(" \r\n %s", buffer);
/* Close open files */
f_close(&fnew);                                                       
 /* Unregister work area prior to discard it */
 f_mount(0, NULL);

最后发现原因,在运行:

 res = f_write(&fnew, textFileBuffer, sizeof(textFileBuffer), &bw)

这条指令时,sizeof(textFileBuffer)(就是计算welcome的长度)的结果是8,就是把"welcome"最后的结尾标志符’\0’也同时写入文件中,这样造成的后果是当执行

res = f_read(&fnew, buffer, sizeof(buffer), &br);

这条指令时,系统会把’\0’当作文件结束的标志,所以不管以后写多少数据,系统都会在写’\0’的地方结束读,读出的数据就不会完整。
解决问题的办法是:将

res = f_write(&fnew, textFileBuffer, sizeof(textFileBuffer), &bw)

这条指令中的sizeof(textFileBuffer)改为sizeof(textFileBuffer)-1,直接忽略最后一位,这样写入的数据才有效,读出的数据才完整!!!

你可能感兴趣的:(stm32)