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);
}
この関数は、テキストファイルの最初の行のみを繰り返し返します。
私の質問
テキストの行を読み取るように関数を変更し(「//何らかのアクションを実行する」で示されるそのような行でアクションを実行することを期待して)、次のループの次の行に移動し、これを次のように繰り返すにはどうすればよいですか?ファイルの終わりに達しましたか?
うまくいけば、これは理にかなっています。
実際には、コードはデータ全体を読み取った後にのみバッファを出力するため、テキストファイルの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
}