Вторая SD не пишет

Простая проблема, не могу понять причину, SD-карта пишет первый файл нормально, а второй вообще не пишет. Может кто-нибудь понять, почему?

    #include <SPI.h>
    #include <SD.h>
    const int chipSelect = BUILTIN_SDCARD;
    File datafile;
    void setup()
    {
      Serial.begin(38400);
      analogReadResolution(13);
      //Инициализируем контакты SPI, чтобы избежать ошибок
      //USB-хост SS-контакт
      pinMode(9, OUTPUT);
      delay(200);
      digitalWrite(9, HIGH);
      delay(200);
      pinMode(chipSelect, OUTPUT);
      delay(200);
      digitalWrite(chipSelect, HIGH);
      delay(200);


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

      // проверяем, присутствует ли карта и может ли она быть инициализирована:
      if (!SD.begin(chipSelect)) {
       Serial.println("Card failed, or not present");
  }
  Serial.println("card initialized.");
  File dFile = SD.open("datalog.txt", FILE_WRITE);
  dFile.println("BORK");
  dFile.close();
  char filename[] = "LOGGER00.CSV";
  for (uint8_t i = 0; i < 100; i++) {
    filename[6] = i / 10 + '0';
    filename[7] = i % 10 + '0';
    if (! SD.exists(filename)) {
      datafile = SD.open(filename, FILE_WRITE);
      break;  // выйти из цикла!
    }
  }
  Serial.println(filename);
  datafile.print("A0,");
  datafile.println("A1");
  if (!datafile){
    Serial.println("oopsydaisy");
  }
}


void loop()
{
  Serial.print("analog 0 is: ");
  Serial.println(analogRead(0));
  Serial.print("analog 1 is: ");
  Serial.println(analogRead(1));

  datafile.print(String(analogRead(0)));
  datafile.print(",");
  datafile.print(String(analogRead(1)));
  datafile.println();
  delay(1000);
}

, 👍-1

Обсуждение

пожалуйста, исправьте название вашего поста... сейчас там написано, что «вторая SD-карта не работает»... все, кто ищет решение проблем с записью нескольких файлов, пропустят ваш пост, @jsotola


2 ответа


Лучший ответ:

0

Вы должны сократить свой код до минимума. Вам нужно поработать, если:

  • Это тот факт, что вы открываете второй файл, что приводит к сбою, или
  • Это способ, которым вы создаете имя файла в своем цикле, или
  • Это способ обращения с файлом после его открытия.

Вам следует добавить дополнительную отладку в вашу программу, чтобы вы знали, как работает ваш цикл. Правильно ли он проверяет наличие файлов? Он заходит слишком далеко? Совсем нет? Правильно ли создается имя файла?

Вы не описали должным образом свои симптомы. Файл действительно создается? Если да, то он просто пустой? (Я так подозреваю).

Почему я так подозреваю? Все просто:

Библиотека SD использует определенное количество грубого кэширования. Ничего не записывается на саму карту SD, пока не будет записан целый блок данных (512 байт) или пока вы не закроете файл. Или вручную сбросите данные на карту.

При выполнении периодической записи в файл, как этот, лучше открывать файл как (O_READ | O_WRITE | O_APPEND) перед каждым блоком записи, а затем закрывать его после этого. Это гарантирует, что файл находится в хорошем состоянии между каждым периодом выборки, и все данные записаны, а FAT обновлен правильно.

Итак, ваш метод должен быть таким:

  1. Найдите неиспользуемое имя файла.
  2. Откройте файл FILE_WRITE (или (O_READ | O_WRITE | O_CREAT) — разные версии библиотеки определяют его немного по-разному), чтобы создать файл.
  3. Закройте файл.

Затем на каждой итерации цикла, где вы хотите написать:

  1. Откройте файл снова как (O_READ | O_WRITE | O_APPEND)
  2. Введите свои данные.
  3. Закройте файл.
,

@Juraj Независимо от того, есть ли у него append или нет, у него есть O_CREAT, поэтому он создаст файл, если его там нет, поэтому он всегда будет успешно создан для первого файла, независимо от того, существует он или нет., @Majenko

но я не вижу такой операции в его коде. и он не был отредактирован, @Juraj

@Juraj О, погоди... Весь этот лишний нерелевантный код ослеплял меня посторонними открытиями файлов. Глубоко внутри на самом деле есть "существует", чего я раньше не видел... леса... деревья... просто показывает важность концепции SSCCE вместо того, чтобы просто сваливать на нас кучу нерелевантного кода., @Majenko

@trinityalps, в чем проблема? Что из ответа Majenko помогло?, @Juraj


0

Вы не закрываете второй файл.

Примеры показывают, что следует закрывать файл после каждой записи и открывать его снова перед следующей записью. Открытие файла с помощью библиотеки SD с использованием флагов FILE_WRITE открывает его для добавления, если файл существует.

В моем проекте у меня есть микроконтроллер с достаточным объемом оперативной памяти (Mega, esp8266 или M0), поэтому я кэширую строки в буфере размером 2000 байт и записываю их в файл, если кэш памяти заполнен.

,