SD卡读写文件流程

提示

仅X2/X3/X5系列支持通过文件流控件来读写SD卡文件,其他系列仅支持用SD卡来升级固件 请参考: 通过SD卡下载工程到串口屏

注意

SD卡也是有写入寿命的,具体取决于SD卡的质量。

SD卡读写文件流程-样例工程下载

资源合集汇总

1.检查文件是否存在

注意

文件路径是字符串形式,需要被引号包裹起来,文件名建议使用英文和数字,使用其他可能会显示乱码(编码不一致导致的)

 1 findfile "sd0/1.txt",sys0
 2 if(sys0==1)
 3 {
 4   //文件存在
 5   msg.bco=GREEN
 6   msg.txt="文件存在"
 7 }else
 8 {
 9   //文件不存在,新建文件
10   newfile "sd0/1.txt",4096
11   //再次检查文件是否存在
12   findfile "sd0/1.txt",sys0
13   if(sys0==1)
14   {
15     //文件创建成功
16     msg.bco=GREEN
17     msg.txt="文件创建成功"
18   }else
19   {
20     //判断为SD卡不存在
21     msg.bco=RED
22     msg.txt="找不到SD卡"
23   }
24 }

注意

也可以用文本控件来保存文件路径,但是请注意文本控件的txt_maxl属性需要足够大,建议设置为200,否则可能因为文件路径不完整而导致打开失败

 1 filePath.txt="sd0/1.txt"
 2 findfile filePath.txt,sys0
 3 if(sys0==1)
 4 {
 5   //文件存在
 6   msg.bco=GREEN
 7   msg.txt="文件存在"
 8 }else
 9 {
10   //文件不存在,新建文件
11   newfile filePath.txt,4096
12   //再次检查文件是否存在
13   findfile filePath.txt,sys0
14   if(sys0==1)
15   {
16     //文件创建成功
17     msg.bco=GREEN
18     msg.txt="文件创建成功"
19   }else
20   {
21     //判断为SD卡不存在
22     msg.bco=RED
23     msg.txt="找不到SD卡"
24   }
25 }

2.打开文件

注意

操作文件需要使用文件流控件

 1 filePath.txt="sd0/1.txt"
 2 findfile filePath.txt,sys0
 3 if(sys0==1)
 4 {
 5   //文件存在,打开文件
 6   sys0=fs0.open(filePath.txt)
 7   if(sys0==1)
 8   {
 9     //文件打开成功
10     msg.bco=GREEN
11     msg.txt="文件打开成功"
12   }
13 }else
14 {
15   //文件不存在,新建文件
16   newfile filePath.txt,4096
17   //再次检查文件是否存在
18   findfile filePath.txt,sys0
19   if(sys0==1)
20   {
21     //文件存在,打开文件
22     sys0=fs0.open(filePath.txt)
23     if(sys0==1)
24     {
25       //文件打开成功
26       msg.bco=GREEN
27       msg.txt="文件创建成功"
28       for(sys0=0;sys0<1024;sys0++)
29       {
30         //手动初始化整个文件,循环1024次,每次写入4字节,总共写入4096个字节,将0-4095初始化为0x00
31         fs0.write(0,0,4)
32       }
33       fs0.close() //有打开就要有关闭,最好写完后立刻关闭
34     }
35   }else
36   {
37     //判断为SD卡不存在
38     msg.bco=RED
39     msg.txt="找不到SD卡"
40   }
41 }

注意

也可以通过文件浏览器来获取文件路径,但是请注意文本控件的txt_maxl属性需要足够大,建议设置为200,否则可能因为文件路径不完整而导致各种问题

此时可以不判断文件是否存在,只需判断fbrowser0.txt非空即可

fbrowser0.txt在你选中了文件之后会自动改变

 1 filePath.txt=fbrowser0.dir+fbrowser0.txt
 2 if(fbrowser0.txt!="")
 3 {
 4   sys0=fs0.open(filePath.txt)
 5   if(sys0==1)
 6   {
 7     //文件打开成功
 8     msg.bco=GREEN
 9     msg.txt="文件打开成功"
10   }
11 }

3.读、写、查找

保存数据时请注意以下几点

1.从哪里写入就从哪里读取(写入和读取前设置文件流的val属性,即读取的位置)。

2.写入时对应指针地址是什么属性,读取时就是什么属性,写入时是字符串属性,读取时就要读取到字符串属性中。写入时是数值属性,读取时就要读取到数值属性中。

read-从文件流读取数据

write-将数据写入文件流

find-按关键字查询并定位文件流指针

4.关闭文件

有打开就必须有关闭

close-关闭文件流

文件流控件-注意事项

新建文件时为什么要初始化文件

电脑上在创建文件时,会自动将整个文件都初始化为0x00,但是在串口屏上并不会

这是因为电脑的cpu是多线程的且电脑的性能远远高于串口屏,而串口屏是单线程

如果串口屏也自动初始化整个文件,当用户创建比较大的文件,如1GB的文件时,串口屏将会因为初始化文件的原因卡住一段时间,可能几分钟到十几分钟不等,取决于SD卡性能

没有初始化文件会怎么样

如果没有初始化文件,那么文件里面就会有之前删除过的文件数据,直接读取时就会有问题,例如读到未初始化的地方可能显示乱码。

如果我不想在屏幕里初始化怎么办呢

你可以提前在电脑模拟器上创建好一个文件,然后把文件拷贝到SD卡里面

SD卡读写文件-样例工程下载

资源合集汇总