我遇到了一个问题,我认为没有理由在那里。
基本思想是使用Arduino中的SdFat库写入SD卡来记录数据。
在记录设备之间将进入休眠状态并使用MOSFET我会完全关闭SD卡以节省电量。
整个代码工作,但只有当我从我刚刚写入的文件中读取数据时。当我从文件中取出代码时,它会创建文件,但根本不会写入文件。
现在,我正在使用延迟而不是微睡,只是为了减少要关注的事情。
下面是与读取文件一起使用的代码,使用示例文件只是为了让这个东西现在正常工作。
const int chipSelect = 4;
/*
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
*/
#include <SdFat.h>
SdFat sd;
SdFile myFile;
char fileName[] = "2468.txt";
int sdPower = 3;
void setup()
{
pinMode(sdPower,OUTPUT);
}
void loop()
{
digitalWrite(sdPower,HIGH);
sd.begin(chipSelect, SPI_HALF_SPEED);
myFile.open(fileName, O_RDWR | O_CREAT | O_AT_END);
myFile.println("Hello World");
myFile.close();
// re-open the file for reading:
if (!myFile.open(fileName, O_READ)) {
sd.errorHalt("opening test.txt for read failed");
}
// read from the file until there's nothing else in it:
int data;
while ((data = myFile.read()) >= 0) Serial.write(data);
// close the file:
myFile.close();
digitalWrite(sdPower,LOW);
delay(1000);
}
上面的工作,但我把最后几行读出来的那一刻,它没有写入文件,就像这样。
const int chipSelect = 4;
/*
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
*/
#include <SdFat.h>
SdFat sd;
SdFile myFile;
char fileName[] = "2468.txt";
int sdPower = 3;
void setup()
{
pinMode(sdPower,OUTPUT);
}
void loop()
{
digitalWrite(3,HIGH);
sd.begin(chipSelect, SPI_HALF_SPEED);
myFile.open(fileName, O_RDWR | O_CREAT | O_AT_END);
myFile.println("Hello World");
myFile.close();
digitalWrite(3,LOW);
delay(1000);
}
然而它仍然创建了文件。这真让我困惑。
为什么程序在删除读取部分时不写?乖,因为我在两个实例中关闭文件都没关系?
也许卡的电源正在被删除
{
digitalWrite(3,LOW);
}
在写入目录和FAT数据之前,通过close()
命令执行该卡。在关闭卡之前尝试延迟1秒钟。工作示例中的读取数据循环确保文件已正确关闭;-)
我知道这已经过时了,但我处于相同的情况,所以我会写下我的答案来帮助其他寻求此事的人。
解决方案很简单,您必须在关闭文件之前flush()
内容:
myFile.println("Hello World");
myFile.flush();
myFile.close();
这将确保将内容写入SD卡。