Arduino逐行读取SD文件C++

Arduino reading SD file line by line C++

本文关键字:文件 C++ SD 读取 逐行 Arduino      更新时间:2023-10-16

我正在尝试从连接到Arduino MEGA的SD卡中逐行读取文本文件"Print1.txt"。到目前为止,我有以下代码:

#include <SD.h>
#include <SPI.h>
int linenumber = 0;
const int buffer_size = 54;
int bufferposition;
File printFile;
char character;
char Buffer[buffer_size];
boolean SDfound;

void setup()
{
  Serial.begin(9600);
  bufferposition = 0;
}
void loop() 
{
  if (SDfound == 0)
  {
    if (!SD.begin(53)) 
    {
      Serial.print("The SD card cannot be found");
      while(1);
    }
  }
  SDfound = 1;
  printFile = SD.open("Part1.txt");

  if (!printFile)
  {
    Serial.print("The text file cannot be opened");
    while(1);
  }
  while (printFile.available() > 0)
  {
    character = printFile.read();
    if (bufferposition < buffer_size - 1)
    {
      Buffer[bufferposition++] = character;
      if ((character == 'n'))
      {
        //new line function recognises a new line and moves on 
        Buffer[bufferposition] = 0;
        //do some action here
        bufferposition = 0;
      }
    }
  }
  Serial.println(Buffer);
  delay(1000);
}

该函数仅重复返回文本文件的第一行。

我的问题

如何更改函数以读取一行文本(希望对此类行执行操作,由"//do some action"显示),然后移动到后续循环中的下一行,重复此操作直到到达文件末尾?

希望这是有道理的。

实际上,您的代码只返回文本文件的最后一行,因为它仅在读取整个数据后打印缓冲区。代码重复打印,因为文件正在循环函数内打开。通常,读取文件应在仅执行一次的setup函数中完成。

您可以读取直到

找到分隔符并将其分配给String缓冲区,而不是逐个读取数据字符到缓冲区中。此方法使代码保持简单。我修复代码的建议如下:

#include <SD.h>
#include <SPI.h>
File printFile;
String buffer;
boolean SDfound;

void setup() {
  Serial.begin(9600);
  if (SDfound == 0) {
    if (!SD.begin(53)) {
      Serial.print("The SD card cannot be found");
      while(1);
    }
  }
  SDfound = 1;
  printFile = SD.open("Part1.txt");
  if (!printFile) {
    Serial.print("The text file cannot be opened");
    while(1);
  }
  while (printFile.available()) {
    buffer = printFile.readStringUntil('n');
    Serial.println(buffer); //Printing for debugging purpose         
    //do some action here
  }
  printFile.close();
}
void loop() {
   //empty
}