我是靠谱客的博主 俊秀信封,最近开发中收集的这篇文章主要介绍【ESP32】 esp32 输入输出文件系统、编码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

系统输入输出、文件操作

官方说明:虚拟文件系统组件

虚拟文件系统 (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 输入输出文件系统、编码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(83)

评论列表共有 0 条评论

立即
投稿
返回
顶部