Записать массив на SD

Я новичок в Arduino, и я задавал здесь несколько вопросов, и они были действительно полезны, поэтому я надеюсь, что мне снова помогут

#define maxLen 800

volatile  unsigned int irBuffer[maxLen]; //stores timings - volatile because changed by ISR
volatile unsigned int x = 0; //Pointer thru irBuffer - volatile because changed by ISR

void setup() {
  Serial.begin(9600); //change BAUD rate as required
  attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);//set up ISR for receiving IR signal
}

void loop() {

  Serial.println(F("Press the button on the remote now - once only"));
  delay(5000); // pause 5 secs
  if (x) { //if a signal is captured
    Serial.println();
    Serial.print(F("Raw: (")); //dump raw header format - for library
    Serial.print((x - 1));
    Serial.print(F(") "));
    detachInterrupt(0);//stop interrupts & capture until finshed here
    for (int i = 1; i < x; i++) { //now dump the times
      if (!(i & 0x1)) Serial.print(F(" "));
      Serial.print(irBuffer[i] - irBuffer[i - 1]);
      Serial.print(F(", "));
    }
    x = 0;
    Serial.println();
    Serial.println();
    attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);//re-enable ISR for receiving IR signal
  }

}

void rxIR_Interrupt_Handler() {
  if (x > maxLen) return; //ignore if irBuffer is already full
  irBuffer[x++] = micros(); //just continually record the time-stamp of signal transitions

}

Я хотел бы изменить приведенный выше код, чтобы он записывался в файл SD, а не печатался через последовательный порт. Я пытался использовать myFile.write или myFile.print, но это не сработает. Может быть, я просто не знаю, как работают функции SD. Какие-нибудь советы? Это функция захвата ИК-сигналов. Мне нужны они для пульта Arduino. Модифицированный код:

//вы можете увеличить это значение на Arduino с более чем 2k SRAM
#define maxLen 800

#include <SPI.h>
#include <SD.h>

File myFile;

volatile  unsigned int irBuffer[maxLen]; //хранит тайминги - изменчивы, т.к. изменены ISR
volatile unsigned int x = 0; //Указатель через irBuffer - изменчив, потому что изменен ISR

void setup() {
  Serial.begin(9600); //изменить скорость передачи по мере необходимости
  attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);//настраиваем ISR для приема ИК-сигнала
}

void loop() {
  // поместите сюда ваш основной код для многократного запуска:

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

  if (!SD.begin(53)) {
    while (1);
  }
  Serial.println("initialization done.");

  // открываем файл. обратите внимание, что одновременно может быть открыт только один файл,
  // так что вы должны закрыть это, прежде чем открывать другое.
  myFile = SD.open("test.txt", FILE_WRITE);

  Serial.println(F("Press the button on the remote now - once only"));
  delay(5000); // пауза 5 секунд
  if (x) { //если сигнал захвачен
    Serial.println();
    myFile.print(F("Raw: (")); // дамп исходного формата заголовка - для библиотеки
    myFile.print((x - 1));
    myFile.print(F(") "));
    detachInterrupt(0);//остановить прерывания & захватывать, пока не закончите здесь
    for (int i = 1; i < x; i++) { // теперь сбрасываем время
      if (!(i & 0x1)) myFile.write(F(" "));
      myFile.print(irBuffer[i] - irBuffer[i - 1]);
      myFile.print(F(", "));
    }
    x = 0;
    Serial.println();
    Serial.println();
    attachInterrupt(0, rxIR_Interrupt_Handler, CHANGE);//повторно включаем ISR для получения ИК-сигнала
  }

}

void rxIR_Interrupt_Handler() {
  if (x > maxLen) return; //игнорировать, если irBuffer уже заполнен
  irBuffer[x++] = micros(); // просто постоянно записывайте метку времени перехода сигнала

}

, 👍0

Обсуждение

Как это не работает? Что происходит на самом деле? И почему бы вам не включить фактический рассматриваемый код (код SD-карты), чтобы мы могли искать ошибки?, @chrisl

Код есть в вопросе. Код работает, он печатает на последовательный монитор. Я просто хочу изменить его для «печати» в файл на SD-карте., @Teofil Sandu

Вы написали, что уже пытались использовать для этого библиотеку SD. Но я не вижу этого в вашем коде. Нам нужно это увидеть, чтобы мы могли найти там возможные ошибки. Мы не будем просто писать код для вас, так как мы не являемся бесплатной службой написания кода. Объясните, в чем именно была проблема, при попытке использовать библиотеку SD. В противном случае ваш вопрос слишком широк., @chrisl

file.print() должен работать точно так же, как Serial.print(). Но сначала нужно открыть файл. Вы читали документацию библиотеки SD? Примеры? Что-нибудь, что вы не поняли в этих документах?, @Edgar Bonet

Вместо этого я просто использовал файл file.print, поэтому не загружал код. Мне просто нужна помощь, чтобы увидеть, в чем проблема, а не чтобы кто-то написал мой код. Сразу добавлю к вопросу., @Teofil Sandu

Вам все еще не хватает описания того, что на самом деле происходит? Разве файл не существует после запуска программы? Содержит ли он мусор или неправильные значения? Если да, то что именно в нем содержится?, @chrisl

В том то и дело, что он ничего не содержит. Вот почему я хотел убедиться, что file.print() делает то же самое. Я просто попробую набросать код по-другому, спасибо!, @Teofil Sandu

Если вы никогда не сделаете myFile.close(), буферизованные данные никогда не будут записаны на SD-карту., @Majenko

@Majenko, это правда! Кажется, теперь это работает, @Teofil Sandu


1 ответ


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

2

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

Два способа принудительной записи буфера на карту:

  • Закройте файл с помощью myFile.close() или
  • Очистить файл с помощью myFile.flush()

Если вы не выполните одно из этих действий после сохранения данных, поскольку вы записываете менее 512 байт, данные будут потеряны при отключении питания (или сбросе) или извлечении SD-карты.

,