Записать массив на 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(); // просто постоянно записывайте метку времени перехода сигнала
}
@Teofil Sandu, 👍0
Обсуждение1 ответ
Лучший ответ:
Вы никогда не закрываете файл. Библиотека SD (из-за того, как работают SD-карты) работает с буфером размером 512 байт. Только когда этот буфер заполнен или библиотека получает инструкции вручную, этот буфер когда-либо будет записан на SD-карту.
Два способа принудительной записи буфера на карту:
- Закройте файл с помощью
myFile.close()
или - Очистить файл с помощью
myFile.flush()
Если вы не выполните одно из этих действий после сохранения данных, поскольку вы записываете менее 512 байт, данные будут потеряны при отключении питания (или сбросе) или извлечении SD-карты.
- Создание файла на SD-карте
- SD-карта не инициализируется
- Почему Arduino сбрасывается во время управления двигателями?
- Печать содержимого файла SD - карты на ЖК-дисплее
- Nextion Display не получает обновленных данных
- Использование Arduino wireless SD Shield для сохранения данных на SD-карту и отправки на ПК по беспроводной сети
- Инициализация SD-карты не удалась
- Arduino Mega2560, Ethernet Shield & OV0706: "Камера не найдена"
Как это не работает? Что происходит на самом деле? И почему бы вам не включить фактический рассматриваемый код (код 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