Проблема с SD картой. Пишет, но не читает...

Тема в разделе "Arduino & Shields", создана пользователем Maza_swamp, 3 фев 2014.

  1. Maza_swamp

    Maza_swamp Нуб

    Добрый день.
    Возникла проблема с SD картой. Использую стандартную библиотеку SD, практически все примеры из нее работают, кроме примера ReadWrite, в котором сначала что-то пишется в файл, потом файл закрывается и должен отрываться для чтения, вот тут то и проблема - открываться отказывается :(
    Т.е. вот это в коде не работает
    // re-open the file for reading:
    myFile = SD.open("test.txt");
    if (myFile) {
    Serial.println("test.txt:");
    Пробовал разные карты. Сам файл test.txt создается, проверял.
    Может кто сталкивался с этим?

    Код (Text):
      myFile = SD.open("test.txt", FILE_WRITE);
     
      // if the file opened okay, write to it:
      if (myFile) {
        Serial.print("Writing to test.txt...");
        myFile.println("testing 1, 2, 3.");
        // close the file:
        myFile.close();
        Serial.println("done.");
      } else {
        // if the file didn't open, print an error:
        Serial.println("error opening test.txt");
      }
     
      // re-open the file for reading:
      myFile = SD.open("test.txt");
      if (myFile) {
        Serial.println("test.txt:");
       
        // read from the file until there's nothing else in it:
        while (myFile.available()) {
            Serial.write(myFile.read());
        }
        // close the file:
        myFile.close();
      } else {
          // if the file didn't open, print an error:
        Serial.println("error opening test.txt");
      }
     
  2. Megakoteyka

    Megakoteyka Оракул Модератор

    По этой статье делал - все работало с первого раза. Карточку брал первую попавшуюся, на пару гигов.
     
  3. Maza_swamp

    Maza_swamp Нуб

    Да я уже все статьи перечитал, у всех все работает, а у меня никак...
    Файл создает, пишет в него, а затем не может открыть для чтения, вот в чем проблема.
     
  4. Maza_swamp

    Maza_swamp Нуб

    Похоже заборол проблему, пересобрал схему на макетке используя короткие провода и все заработало :cool:
     
  5. ImrDuke

    ImrDuke Гик

    По какой то причине, данные в файл не добавляются, а затирают предыдущую строку.
    Записывается только 1 последняя строчка.
    Использую код из примера.

    Код (C++):
    #include <SPI.h>
    #include <SD.h>

    const int chipSelect = 10;

    void setup() {
      // Open serial communications and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB port only
      }


      Serial.print("Initializing SD card...");

      // see if the card is present and can be initialized:
      if (!SD.begin(chipSelect)) {
        Serial.println("Card failed, or not present");
        // don't do anything more:
        return;
      }
      Serial.println("card initialized.");
    }

    void loop() {
      // make a string for assembling the data to log:
      String dataString = "";

      // read three sensors and append to the string:
      for (int analogPin = 0; analogPin < 3; analogPin++) {
        int sensor = analogRead(analogPin);
        dataString += String(sensor);
        if (analogPin < 2) {
          dataString += ",";
        }
      }

      // open the file. note that only one file can be open at a time,
      // so you have to close this one before opening another.
      File dataFile = SD.open("datalog.txt", FILE_WRITE);

      // if the file is available, write to it:
      if (dataFile) {
        dataFile.println(dataString);
        dataFile.close();
        // print to the serial port too:
        Serial.println(dataString);
      }
      // if the file isn't open, pop up an error:
      else {
        Serial.println("error opening datalog.txt");
      }
    }
     
  6. DIYMan

    DIYMan Guest

    Это нынче так модно - каждый проход loop открывать/закрывать файл? Что мешает открыть его в setup, а в loop просто писать туда до посинения? Да и не уверен, что это хорошая идея - каждый проход loop писать в файл показания датчиков - вы уверены, что вам каждые несколько миллисекунд (если не меньше) надо в файл писать?
     
  7. ImrDuke

    ImrDuke Гик

    Это стандартный пример из программы.
     
  8. DIYMan

    DIYMan Guest

    Да ну? Не видел такого примера в поставке IDE. Чтобы в setup читалось - видел, такой дичи - нет. А скиньте плз название примера - мож, я чего пропустил и такая дичь реально в поставке?
     
  9. ImrDuke

    ImrDuke Гик

    SD -> Datalogger

    Код (C++):
    /*
      SD card datalogger

      This example shows how to log data from three analog sensors
      to an SD card using the SD library.

      The circuit:
       analog sensors on analog ins 0, 1, and 2
       SD card attached to SPI bus as follows:
    ** MOSI - pin 11
    ** MISO - pin 12
    ** CLK - pin 13
    ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN)

      created  24 Nov 2010
      modified 9 Apr 2012
      by Tom Igoe

      This example code is in the public domain.

    */
     
  10. DIYMan

    DIYMan Guest

    Мля, в натуре дичь такая есть в примерах. Не следуйте этому примеру, он не просто плохой - он ОЧЕНЬ плохой, от слова "совсем". За такое надо по рукам бить автору примера, потому что по голове ему уже били, видимо, и просто уже жалко калеку.
     
  11. ImrDuke

    ImrDuke Гик

    Может быть и дичь, но месяца два назад она работала - добавляла данные в файл, а сейчас просто затирает.
     
  12. ImrDuke

    ImrDuke Гик

    Попробую вечером так сделать.

    Код (C++):
    #include <SPI.h>
    #include <SD.h>
    const int chipSelect = 10;
    File dataFile;
    #define LOGFILE "datalog.txt"

    void setup() {
      Serial.begin(9600);
      Serial.print("Initializing SD card...");
      if (!SD.begin(chipSelect)) {
        Serial.println("Card failed, or not present");
        return;
      }
      Serial.println("card initialized.");
      Serial.println("Opening logfile for write.");
      dataFile = SD.open(LOGFILE, FILE_WRITE);
      if (! dataFile) {
        Serial.println("error opening log file");
        while (1) ;
      }
    }

    void loop() {
      String dataString = "";
      for (int analogPin = 0; analogPin < 3; analogPin++) {
        int sensor = analogRead(analogPin);
        dataString += String(sensor);
        if (analogPin < 2) {
          dataString += ",";
        }
      }
      dataFile.println(dataString);
      dataFile.flush();
      Serial.println(dataString);
      delay(3000);
    }
     
  13. ImrDuke

    ImrDuke Гик

    Опять же у Амперки в "Системе регистрации данных" (Набор IoT (Интернет вещей)) - сделано точно так же как и в Datalogger

    Код (C++):
    #include <SPI.h>
    #include <SD.h>
    #include <math.h>
    #define LIGHT_PIN A3
    #define TEMP_PIN A2
    #define CS 8
    void setup() {
      Serial.begin(9600);
      if (!SD.begin(CS)) {
        Serial.println("initialization failed!");
        return;
      }
    }
    void loop() {
      float r_light = 10.0
                / (1023.0 / analogRead(LIGHT_PIN) - 1.0);
      float light = 10.0 * pow(14.0 / r_light, 1.6);
      float v_temp = 1023.0 / analogRead(TEMP_PIN) - 1.0;
      float temp = 1.0 / ( -log(v_temp) / 3977.0
                                 + 1.0 / 295.0 ) - 273.0;
      String data = String(millis() / 1000) + ";"
                    + String(light) + ";" + String(temp);
      data.replace(".", ",");
      Serial.println(data);
      File logFile = SD.open("log.csv", FILE_WRITE);
      logFile.println(data);
      logFile.close();
      delay(1000);
    }
     
  14. DIYMan

    DIYMan Guest

    Вот и я о чём: так насиловать SD - хорошо ещё, что хоть как-то проработала. Не верите - ваше право, мне пофик, делайте по этому кривому примеру. Но ещё раз: так - не делается.
     
  15. DIYMan

    DIYMan Guest

    Нет, не точно также, там как минимум - задержка в секунду стоит. Хотя тоже кривой пример. Вот - нормально переписанный пример амперки:

    Код (C++):
    #include <SPI.h>
    #include <SD.h>
    #include <math.h>
    #define LIGHT_PIN A3
    #define TEMP_PIN A2
    #define CS 8

    File logFile;

    void setup()
    {
      Serial.begin(9600);
      if (!SD.begin(CS))
      {
        Serial.println("initialization failed!");
        return;
      }
     
     
      logFile = SD.open("log.csv", FILE_WRITE);
     
    }
    void loop()
    {  
      float r_light = 10.0
                / (1023.0 / analogRead(LIGHT_PIN) - 1.0);
      float light = 10.0 * pow(14.0 / r_light, 1.6);
      float v_temp = 1023.0 / analogRead(TEMP_PIN) - 1.0;
      float temp = 1.0 / ( -log(v_temp) / 3977.0
                                 + 1.0 / 295.0 ) - 273.0;
      String data = String(millis() / 1000) + ";"
                    + String(light) + ";" + String(temp);
      data.replace(".", ",");
      Serial.println(data);

      if(logFile)
      {
        logFile.println(data);
      }
      delay(1000);
    }
    Разницу видите?
     
  16. ImrDuke

    ImrDuke Гик

    Так у меня вообще задержка более 10 минут стоит. Это сюда я выложил пример из среды чтоб быть уверенным что не я где то в коде накосячил.

    А почему в вашем примере нет команды на закрытие файла?

    В #12 посте я правильно код написал?
     
    Последнее редактирование: 7 дек 2017
  17. DIYMan

    DIYMan Guest

    Так и надо - указывать СВОЙ код, а не вводить людей в заблуждение.

    А в том примере закрывать файл не надо - в него пишется постоянно, пока дунька крутит loop.

    Навскидку криминала не видно. Попробуйте просто другую SD-карточку, всегда существует вероятность, что текущую вы уже угробили.
     
  18. ImrDuke

    ImrDuke Гик

    А-а-а!!! Я её победил! :D
    Нашел в чем была причина.Никакие программные манипуляции не помогли.
    Оказалось что при обновлении библиотеки SD старая так и осталась в "Program Files", а вот новая прописалась в "Мои документы". Как так получилось и как они друг другу мешали - не понятно.
    Удалил одну из "Мои документы", перезагрузил скетч и все заработало! :)