针对正点原子在视频中进行了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();
通过调试,目前发现有两种更改方法:
(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);
输出结果如下:
补充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,直接忽略最后一位,这样写入的数据才有效,读出的数据才完整!!!