web-dev-qa-db-ja.com

ArduinoがSDファイルを1行ずつC ++で読み取る

ArduinoMEGAに接続されているSDカードからテキストファイル「Print1.txt」を1行ずつ読み取ろうとしています。これまでのところ、次のコードがあります。

#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);
}

この関数は、テキストファイルの最初の行のみを繰り返し返します。

私の質問

テキストの行を読み取るように関数を変更し(「//何らかのアクションを実行する」で示されるそのような行でアクションを実行することを期待して)、次のループの次の行に移動し、これを次のように繰り返すにはどうすればよいですか?ファイルの終わりに達しましたか?

うまくいけば、これは理にかなっています。

6
Julian Das

実際には、コードはデータ全体を読み取った後にのみバッファを出力するため、テキストファイルのlast行のみを返します。ファイルがループ関数内で開かれているため、コードが繰り返し印刷されています。通常、ファイルの読み取りは、1回だけ実行されるsetup関数で実行する必要があります。

データをcharごとにバッファに読み込む代わりに、区切り文字が見つかるまで読み取り、それを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
}
11
Arton Dorneles