ESP32学习笔记-挂载SD卡读写TXT

写在前面

几经波折,终于达到预期,在此做个记录。

测试代码

//加载库
#include "Arduino.h"
#include "FS.h"
#include "SD.h"
#include "SPI.h"

//定义SD针脚
#define TFT_SD  D7

void setup()
{
  //开启串口
  Serial.begin(115200);

  //挂载SD卡
  MountSD();

  //路径
  String path1 = "/hello.txt";
  //内容
  String str1 = "hello world !";
  //写入(覆盖)
  writeTxt(SD,path1,str1);
  
  //路径
  String path2 = "/love.txt";
  //内容
  String str2 = "i love you !";
  //写入(续写)
  writeTxt_APPEND(SD,path2,str2);

  //读取1
  String txt1 =  readTxt(SD,path1);
  Serial.println( txt1 );

  //读取2
  String txt2 =  readTxt(SD,path2);
  Serial.println( txt2 );

}

void loop()
{
  
}


//挂载SD卡
void MountSD()
{
  //开启SD卡
  if(SD.begin())
  {
    //打印成功
    Serial.println("Card Mount succeed");
  }
  else
  {
    //打印失败
    Serial.println("Card Mount Failed");
    //挂载失败,延时重启
    delay(1000);
    //重启
    return;
  }

  //获取SD类型
  uint8_t cardType = SD.cardType();
  switch(cardType)
  {
    case 1:
      Serial.println("CARD_MMC");
      break;
    case 2:
      Serial.println("CARD_SD");
      break;
    case 3:
      Serial.println("CARD_SDHC");
      break;
    case 4:
      Serial.println("CARD_UNKNOWN");
      break;
    default:
      Serial.println("CARD_NONE");
      Serial.println("Please insert SD card");
      delay(1000);
      return;
  }
}

//写入(FILE_WRITE)
void writeTxt(fs::FS &fs,String path,String str)
{
  //打开文件
  File myFile = fs.open(path, FILE_WRITE);  //FILE_WRITE 覆写

  //如果文件打开,则进行写入
  if (myFile)
  {
    //打印开始
    Serial.println("Start write:" + path);
    //写入
    myFile.println(str);
    // 关闭文件
    myFile.close();
    //打印完成
    Serial.println("Complete write:" + path);
  }
  //如果文件没有打开,则打印错误
  else
  {
    Serial.println("error:Write failure");
  }
}

//写入(FILE_APPEND)
void writeTxt_APPEND(fs::FS &fs,String path,String str)
{
  //打开文件
  File myFile = fs.open(path, FILE_APPEND);  //FILE_APPEND 续写

  //如果文件打开,则进行写入
  if (myFile)
  {
    //打印开始
    Serial.println("Start write_APPEND:" + path);
    //写入
    myFile.println(str);
    // 关闭文件
    myFile.close();
    //打印完成
    Serial.println("Complete write_APPEND:" + path);
  }
  //如果文件没有打开,则打印错误
  else
  {
    Serial.println("error:Write failure");
  }
}

//读取
String readTxt(fs::FS &fs,String path)
{
  //创建返回值
  String txt;
  //打开文件
  File myFile = fs.open(path,FILE_READ);  //FILE_READ 只读
  //如果文件打开,则进行读取
  if (myFile)
  {
    //打印开始
    Serial.println("Start Read:" + path);
    //读取
    if( myFile.available() )
    {
      txt = myFile.readString();
    }
    //关闭文件打开状态
    myFile.close();
    //打印完成
    Serial.println("Complete read:" + path); 
  }
  //如果文件没有打开,则打印错误
  else
  {
    Serial.println("error:Read failure");
  }
  //返回
  return txt;
}

测试结果

注意事项

1、确认SD卡针脚

2、fs.open(path,mode)函数,mode有多种方式

        FILE_WRITE       以可写的方式打开,覆写内容

        FILE_APPEND    以可写的方式打开,续写内容

        FILE_READ         以只读的方式打开

3、fs.readString()函数,直接读取文本,并返回String

参考

Arduino UNO:在TF卡中创建并读写TXT文件_arduino uno sd卡 error opening test.txt-CSDN博客

玩转 ESP32 + Arduino (二十四) SD卡读写-CSDN博客

DFR0654_FireBeetle_Board_ESP32_E (dfrobot.com.cn)

ESP32-IDF是乐鑫信息科技有限公司为其ESP32系列微控制器提供的官方开发框架。ESP32-IDF支持SD卡读写操作,主要通过VFS(虚拟文件系统)接口实现。下面是使用ESP-IDF进行SD卡文件操作的基本步骤: 1. 初始化SD卡:首先,需要使用`sdmmc_host_t`结构体来配置SD卡的通信参数,然后通过`sdmmc_card_t`结构体来进行SD卡的初始化。 2. 打开文件:使用`f_open`函数来打开一个文件,这个函数需要传入`FILE`指针、文件路径和文件模式(读模式、写模式等)。 3. 读写操作:文件打开成功后,可以使用`f_read`、`f_write`等函数来进行文件的读写操作。 4. 关闭文件:操作完成后,需要使用`f_close`函数来关闭文件,释放资源。 具体代码示例: ```c #include "esp_vfs_fat.h" #include "sdmmc_cmd.h" // 初始化SD卡 esp_err_t ret = esp_vfs_fat_sdmmc_mount("/sdcard", &host, &card, NULL); // 打开文件 FILE* f = fopen("/sdcard/helloworld.txt", "w"); if (f == NULL) { // 文件打开失败处理 } // 写入内容 fprintf(f, "Hello World!\n"); // 关闭文件 fclose(f); // 卸载SD卡 esp_vfs_fat_sdcard_unmount("/sdcard", &card); ``` 在进行文件操作时,需要注意以下几点: - 确保SD卡已经正确插入ESP32开发板,并且供电充足。 - 确保SD卡已经格式化为FAT格式,ESP-IDF主要支持FAT文件系统的SD卡。 - 在使用完文件和SD卡后,应该关闭文件并卸载SD卡,以避免数据丢失或其他问题。 - 检查`esp_vfs_fat_sdmmc_mount`等函数的返回值,确保操作成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值