2012-10-28 5 views
1

Je crée un programme qui prend 10 mesures d'une tension analogique sur pin0 et l'imprime dans un fichier journal. Le problème que je rencontre vient quand j'essaye de m'assurer que le fichier est vide. J'utilise SD.remove() afin de supprimer un fichier journal précédent. Lorsque je fais cela, le nouveau fichier journal n'est jamais écrit. Lorsque je supprime l'appel à SD.remove(), le programme fonctionne correctement. Est-ce un bug connu dans la bibliothèque SD ou y a-t-il une façon sournoise de le faire?Utilisation de SD.remove() et de la bibliothèque SD dans Arduino

Le code est ci-dessous.

#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

Quelle carte SD utilisez-vous? Par exemple, SD ou SDHC? Capacité? Marque (par exemple SanDisk)? –

+0

J'utilise une microSD 2gb de marque Sandisk. – Radrider33

Répondre

0

J'ai trouvé la source de l'erreur. Lorsque j'ai appelé if(SD.exists()) après avoir ouvert un nouveau fichier journal, la bibliothèque n'a pas aimé cela. Je suppose SD.exists() juste vérifie si l'adresse ou l'objet retourné par ouvrir est NULL. Cependant, l'appeler quand le fichier est déjà ouvert provoquerait des comportements étranges. Après avoir retiré cet appel à l'intérieur, tout va bien. Merci pour toutes les suggestions!

0

Alors .. D'abord, vous voir si existe LogFile.log, si elle ne vous supprimez ANALOG.LOG. Ensuite, vous créez ANALOG.LOG. Après cela, vous vérifiez si LOGFILE.LOG existe. Si ce n'est pas le cas, vous imprimez une erreur et ouvrez ANALOG.LOG.

Quel est le but de LOGFILE.LOG? Ne devriez-vous pas simplement changer LOGFILE en ANALOG?

+0

Bonne capture, j'ai effectivement "supprimé" le fichier incorrect dans le code que j'avais téléchargé ici. – Radrider33

+0

Si cela vous a aidé, veuillez le marquer comme la bonne réponse. – Niek

Questions connexes