Перейти к содержимому

Фото
- - - - -

Arduino бесконечное чтение файла


  • Вы не можете создать новую тему
  • Please log in to reply
6 ответов в этой теме

#1 StrikeR

StrikeR

    бугога

  • Постоялец
  • 798 сообщений
  • Откуда:QLD. Australia

Отправлено 21 августа 2016 - 00:33

Имеем код, который считывает файл с SD карточки и передаёт его в сериал:

#include <SPI.h>
#include <SD.h>
const int chipSelect = 4;
File dataFile;


void setup(){
  Serial.begin(115200);
  Serial.print("Initializing SD card...");
  opensd();
}
void opensd(){
  if (!SD.begin(chipSelect)) {
    return;
  }else{
    Serial.println("Card loaded");
    openme();
  }
}
void openme(){
  dataFile = SD.open("test2.wav");
  if (dataFile) {
    while (dataFile.available()) {
      Serial.write(dataFile.read());
    }
    dataFile.close();
  }else {
    Serial.println("error opening file");
  }
}
void loop(){


}

Как правильно сделать так, что бы при окончании чтения файла код чтения и передачи начинался заново? 

 

Был такой вариант:

void openme(){
   dataFile = SD.open("test2.wav");
  if (dataFile) {
    while (dataFile.available()) {
      Serial.write(dataFile.read());
    }
    delay(1000);
    dataFile.close();
    openme();
  }else {
    Serial.println("error opening file");
  }
}

Т.е. ф-ция открытия файла вызывала саму себя после, вроде как, оконочания чтения файла. Но, после раза эдак 20ого передача заканчивалась

 

  • 0

#2 EvroStandart

EvroStandart
  • Постоялец
  • 1 159 сообщений

Отправлено 21 августа 2016 - 19:56

Каким образом передача заканчивается? Вылетает ошибка?


  • 0

#3 Вырвиглаз

Вырвиглаз

    Убийца травы

  • Постоялец
  • 15 928 сообщений
  • Откуда:Эстония, Таллин

Отправлено 21 августа 2016 - 21:16

Вот за что я не люблю абдурину. Черт его знает, что там вообще происходит. Но пока все работает, это никого не парит. А вот как начинаются мелкие глюки, народ впадает либо в панику, либо в ступор.


  • 0
Кто живет и грешит в Эстонии, тот опять родится в Эстонии.

#4 StrikeR

StrikeR

    бугога

  • Постоялец
  • 798 сообщений
  • Откуда:QLD. Australia

Отправлено 21 августа 2016 - 21:42

Каким образом передача заканчивается? Вылетает ошибка?

 

Никак. Просто останавливалась передача. Никаких ошибок, нихрена. На форуме ардуины подсказали решение и, возможно, из-за чего стопорилось.

С конца: Постоянный вызов ф-ции скорее всего вызывал overflow.

 

Решение:

Чтение файла всучить в лууп и досигнув конца вызывать seek(0)

 

В итоге получилось:

void loop(){
  if (dataFile.available()){
    Serial.write(dataFile.read());
  }else{
    dataFile.seek(0);
  }
}

Вроде работает.

 

Просто я действовал со стороны знаний дважаскрипта того же (логика то у языка должна быть приемрно одинакова, как мне показалось). Оказалось, что хрена с два


  • 0

#5 EvroStandart

EvroStandart
  • Постоялец
  • 1 159 сообщений

Отправлено 22 августа 2016 - 08:31


    Serial.write(dataFile.read());

 

Я примерно так и думал. 

Скорее всего эта команда запускает параллельный поток и программа бежит дальше. В вечном цикле получаются глюки.


  • 0

#6 Vitalts

Vitalts
  • Постоялец
  • 1 852 сообщений

Отправлено 22 августа 2016 - 11:11

нет здесь никакой параллельности, и проблема уже озвучена - вечная рекурсия, приводящая к переполнению стека, как и решение, отказаться от рекурсии.


  • 2

#7 ParadoxL

ParadoxL
  • Постоялец
  • 5 023 сообщений
  • Откуда:Edinburg

Отправлено 01 февраля 2017 - 20:28

:) последний ответ верный ... переполнение памяти. 


  • 0
Victoria nulla est, Quam quae confessos animo quoque subjugat hostes ...
Верю в смерть после жизни, любовь после секса и в крем после бритья ...