2012-10-28 33 views
1

我正在構建一個程序,該程序需要在pin0上進行10次模擬電壓測量並將其打印到日誌文件中。當我嘗試確保文件爲空時,我遇到了這個問題。我正在使用SD.remove()以刪除以前的日誌文件。當我這樣做時,新的日誌文件永遠不會寫入。當我刪除對SD.remove()的呼叫時,程序正常工作。這是SD庫中的一些已知錯誤還是有一些偷偷摸摸的方法呢?在Arduino中使用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; 
} 
+0

您使用的是什麼SD卡?例如,SD還是SDHC?容量?品牌(如SanDisk)? –

+0

我正在使用Sandisk品牌的microSD 2GB。 – Radrider33

回答

0

我找到了錯誤的來源。當我打開一個新的日誌文件後打電話給if(SD.exists())時,該庫不喜歡那個。我假設SD.exists()只是檢查open返回的地址或對象是否爲NULL。但是,當文件已經打開時調用它會導致一些奇怪的行爲。在打開裏面的電話後,一切都很好。感謝所有的建議!

0

所以..首先你會看到如果LOGFILE.LOG存在,如果它刪除了ANALOG.LOG。然後你創建ANALOG.LOG。之後,您檢查是否存在LOGFILE.LOG。如果不是,則會打印一個錯誤並打開ANALOG.LOG。

LOGFILE.LOG的目的究竟是什麼?不應該只是將LOGFILE更改爲ANALOG?

+0

好,我實際上「刪除」了我在這裏上傳的代碼中的錯誤文件。 – Radrider33

+0

如果這對您有所幫助,請將其標記爲正確答案。 – Niek