概述
系统输入输出、文件操作
官方说明:虚拟文件系统组件
虚拟文件系统 (VFS) 组件可为一些驱动提供一个统一接口。有了该接口,用户可像操作普通文件一样操作虚拟文件。这类驱动程序可以是 FAT、SPIFFS 等真实文件系统,也可以是有文件类接口的设备驱动程序。
ESP32 支持C标准库<stdio.h>里定义的各类函数。在高层级,每个 FS 驱动程序均与某些路径前缀相关联。当一个 C 库函数需要打开文件时,VFS 组件将搜索与该文件所在文件路径相关联的 FS 驱动程序,并将调用传递给该驱动程序。针对该文件的读取、写入等其他操作的调用也将传递给这个驱动程序。
C标准库定义的文件结构体是FILE,C参考说明链接,常用函数如下:
FILE *fopen(const char *filename, const char *mode)
int fclose(FILE *stream)
int fseek(FILE *stream, long int offset, int whence)
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
FAT文件系统定义的结构体是FIL,FatFs参考说明链接,常用函数如下:
f_open - Open/Create a file
f_close - Close an open file
f_read - Read data from the file
f_write - Write data to the file
f_lseek - Move read/write pointer, Expand size
FRESULT f_open (
FIL* fp, /* [OUT] Pointer to the file object structure */
const TCHAR* path, /* [IN] File name */
BYTE mode /* [IN] Mode flags */
);
FRESULT f_close (
FIL* fp /* [IN] Pointer to the file object */
);
FRESULT f_read (
FIL* fp, /* [IN] File object */
void* buff, /* [OUT] Buffer to store read data */
UINT btr, /* [IN] Number of bytes to read */
UINT* br /* [OUT] Number of bytes read */
);
FRESULT f_write (
FIL* fp, /* [IN] Pointer to the file object structure */
const void* buff, /* [IN] Pointer to the data to be written */
UINT btw, /* [IN] Number of bytes to write */
UINT* bw /* [OUT] Pointer to the variable to return number of bytes written */
);
FRESULT f_lseek (
FIL* fp, /* [IN] File object */
FSIZE_t ofs /* [IN] Offset of file read/write pointer to be set */
);
FRESULT f_rewind (
FIL* fp /* [IN] File object */
);
注意:f_open时有时会导致崩溃,在 f_read(&fil,(const TCHAR *)File_path,FA_READ)
的参数中,无法找到 fil
的地址。将 FIL fil;
从函数外拿出,定义为全局变量,即可解决。
fopen与open的区别
缓冲文件系统(fopen) :在内存为每个文件开辟一个缓存区,当执行读操作,从磁盘文件将数据读入内存缓冲区,装满后从内存缓冲区依次读取数据。写操作同理。内存缓冲区的大小影响着实际操作外存的次数,缓冲区越大,操作外存的次数越少,执行速度快,效率高。缓冲区大小由机器而定。借助文件结构体指针对文件管理,可读写字符串、格式化数据、二进制数据。
非缓冲文件系统(open):依赖操作系统功能对文件读写,不设文件结构体指针,只能读写二进制文件。
2、open属于低级IO,fopen属于高级IO
3、open返回文件描述符,属于用户态,读写需进行用户态与内核态切换。fopen返回文件指针
4、open是系统函数,不可移植。fopen是标准C函数,可移植这些问题在移植库函数时可能会遇到。
esp32 FAT 编码
为了更好支持中文文件名,建议在menuconfig里面更改文件编码设置:(Top) →Component config →FAT Filesystem support
* OEM Code Page (simplified Chinese (DBCS) (CP936))
* Long filename support (Long filename buffer in heap )
* (255) Max long filename length
* API character encoding (API uses UTF-8 encoding )
* (0) Number of simultaneously open files protected by lock function
* (10000) Timeout for acquiring a file lock, ms
* Use separate cache for each file
* Perfer external RAM when allocating FATFS buffers
最后
以上就是俊秀信封为你收集整理的【ESP32】 esp32 输入输出文件系统、编码的全部内容,希望文章能够帮你解决【ESP32】 esp32 输入输出文件系统、编码所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复