使用Arduino中的SD.Remove()和SD库

Using SD.remove() and SD library in Arduino

本文关键字:SD Remove Arduino 中的 使用      更新时间:2023-10-16

我正在构建一个程序,该程序在pin0上进行了10个模拟电压的测量,并将其打印到日志文件中。当我尝试确保文件空白时,我遇到的问题就来了。我正在使用SD.remove()来删除以前的日志文件。当我这样做时,新的日志文件永远不会真正写入。当我删除对SD.remove()的呼叫时,程序可以正常工作。这是SD库中的一些已知错误,还是在此方面有一些偷偷摸摸的方法?

代码在下面。

#include <SD.h>
#define OUTPUT_PIN 9 //Using SparkFun MP3 shield
#define DEFAULT_OUTPUT 10
#define VOLTAGE_REF (5)
//Reads a voltage on pin0. by default, the reference voltage is set to 5 V, but
//it can be changed by changing VOLTAGE_REF.
void setup() {
    Serial.begin(9600);
    Serial.println("Program Initialized");
    pinMode(DEFAULT_OUTPUT ,OUTPUT); //Needs to be on to use the library
    pinMode(0, INPUT);
    if (!SD.begin(OUTPUT_PIN)) {
        //init error
        Serial.println("Error initializing SD card. Reset the Arduino and try again");
        return;
    }
    Serial.println("Card sucessfully initialized");
    if (SD.exists("LOGFILE.LOG") {
        SD.remove("LOGFILE.LOG"); //We don't want to use the same file <<THIS IS THE BUG?
    }
    delay(10); //Make sure changes are applied
    File logFile = SD.open("ANALOG.LOG", FILE_WRITE); //Create a new one every time
    if (!SD.exists("LOGFILE.LOG")) {
        Serial.println("There was some error making a new instance of the logfile?");
        delay(1000);
        SD.open("ANALOG.LOG", FILE_WRITE);
    }
    int i;
    if (logFile) {
        for(i=0;i<10;i++) {
            int j = 0;
            char str[64];
            Serial.print("Reading analog sensor value");
            for(j=0;j<=i;j++) {
                Serial.print(".");
            }
            Serial.println();
            logFile.print("Read #");
            logFile.print(i+1);
            logFile.print(" : ");
            logFile.print(doVoltageRead(0));
             unsigned char l = logFile.println(" V");
             if (!l)
                 Serial.println("No data written");
             delay(500);
        }
        Serial.println("Done.");
        logFile.close(); //Close the logfile
        Serial.println("Data sucessfully written");
    }
    else {
        //Couldn't create file
        Serial.println("There was an error creating the logfile");
    }
}
void loop() {
    //We don't really need to do anything here
}
float doVoltageRead(int pin) {
    int voltageRead = analogRead(pin);
    double divisor = (voltageRead * 0.00097752);
    float finalVoltage =(VOLTAGE_REF * divisor);
    Serial.println(finalVoltage);
    return finalVoltage;
}

so ..首先,您查看logfile.log是否存在,如果它执行删除Analog.log。然后,您创建Analog.log。之后,您检查logfile.log是否存在。如果没有,则打印错误并打开Analog.log。

logfile.log的目的到底是什么?您不应该只是将logfile更改为模拟吗?

我找到了错误的来源。当我打开新的日志文件后打电话给if(SD.exists())时,库不喜欢。我假设SD.exists()仅检查打开返回的地址或对象是否为null。但是,当文件已经打开时调用它会导致一些奇怪的行为。删除该电话打开内部后,一切都很好。感谢所有的建议!