Rainbow板载一个TF卡的卡座,可以直接插入TF卡。Rainbow成功移植了Fatfs文件系统,可以直接使用Fatfs的函数对文件进行读写,同时,为了简化对文件的操作,开发包中封装了对文件读写类库,可以更加方便对文件进行读写。
考虑到嵌入式系统的特点,文件系统有一些小的限制:
1、文件名长度最大不超过8个字符,后缀名不超过3个字符
2、不支持中文文件名
Rainbow采用C++对fatfs进行了封装,对文件读写变得更加简单,我们看看文件读写的步骤:
1、定义FileStream对象:FileStream file(fileName, FA_OPEN_ALWAYS | FA_WRITE);
在定义的时候需要指定要打开的文件全路径以及文件打开的方式,以写的方式打开文件,如果文件不存在,会产生异常,需要加上FA_OPEN_ALWAYS,FA_WRITE表示以写的方式打开,FA_READ表示已读的方式打开文件
2、可以通过if(file)来判断文件是否打开成功,如果打开成功,if条件成立
3、如果文件打开成功,接下来就可以调用
file.write((uint8_t *)Write_Buffer, BUFFER_SIZE)或者
file.read((uint8_t *)Read_Buffer, BUFFER_SIZE)
来对文件进行读写操作
4、文件读写完毕,调用file.close()关闭文件
在软件包的“Projects\File”文件夹包含了本文的完整工程,可以直接编译、烧写和调试。这个程序主要展示如何对TF中文件进行读写,看看main.cpp的代码:
#include "WProgram.h"
#include "File.h"
#define countof(a) (sizeof(a) / sizeof(*(a)))
#define BUFFER_SIZE (countof(Write_Buffer)-1)
uint8_t Write_Buffer[] = "STM32F10xx Fatfs Demo";
uint8_t Read_Buffer[BUFFER_SIZE];
int main()
{
boardInit();
Serial.begin();
Serial.println("Fatfs demo start...");
//读写TF卡的根目录中的demo.txt
String fileName = "/demo.txt";
//以写的方式打开一个文件,写入字符串
//为了测试完整的读写过程,我们没有以读写方式打开文件,而是先以写的方式打开,然后关闭,然后再以读的方式打开读取写入内容
FileStream file_w(fileName, FA_OPEN_ALWAYS | FA_WRITE);
if(file_w)
{
if(file_w.write((uint8_t *)Write_Buffer, BUFFER_SIZE) == BUFFER_SIZE)
{
Serial.print("Write \"");
Serial.print((char *)Write_Buffer);
Serial.println("\" to demo.txt ... ");
}
}
//写入完毕,关闭文件
file_w.close();
//以读的方式打开demo.txt
FileStream file_r(fileName, FA_READ);
if(file_r)
{
if(file_r.read((uint8_t *)Read_Buffer, BUFFER_SIZE) == BUFFER_SIZE)
{
Serial.print("Read \"");
Serial.print((char *)Read_Buffer);
Serial.println("\" from demo.txt ... ");
}
}
//读取完毕,关闭文件
file_r.close();
Serial.println("Fatfs demo end...");
}
上面的程序编译无误后,将程序烧写到Rainbow中,然后在电脑上运行串口调试工具并和Rainbow连接成功,可以在串口调试工具中看到文件读写的日志。将TF卡从Rainbow中取出,放到电脑上可以看到在根目录中创建了一个demo.txt,打开demo.txt后可以看到里面保存的内容正是我们写入的信息。