File.read() всегда возвращает значение -1

sd-card oled ssd1306

Я пытаюсь распечатать текстовый файл с SD-карты на SSD1306, используя библиотеку u8x8. Вот текущий код:

#include <SD.h>

#include <Arduino.h>
#include <U8x8lib.h>

#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

  U8X8_SSD1306_128X64_NONAME_HW_I2C u8x8(/* reset=*/ U8X8_PIN_NONE);   

/*
  Этот пример, вероятно, не будет работать с SSD1606 из
-за замены внутреннего буфера
*/
#define maxChar  128
#define rows 8
#define cols 16

File myFile;
int x = 0;
int y = 0;
char c;

void setup()
{
  /*Serial.begin(9600);
  Serial.print("Initializing SD... ");
  if (!SD.begin(10)) {
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");*/

  u8x8.begin();
  delay(500);
  u8x8.setFont(u8x8_font_amstrad_cpc_extended_f);

  myFile = SD.open("target.txt", FILE_READ);
  u8x8.clear();
  u8x8.print("ciao");
  u8x8.print(myFile.read());
  delay(2000);
  printNewSet();
}
void loop()
{
  
}

void printNewSet()
{
  u8x8.clear();
  x = 0;
  y = 0;
  while (myFile.available() && y<rows)
  {
    c = (char) myFile.read();
    if (c == '\n') c = 'a';
    u8x8.print(c);
    stepCoords();
  }
}

void stepCoords()
{
  x++;
  if (x >= cols) newLine();
}
void newLine()
{
  u8x8.print('\n');
  x = 0;
  y++;
}

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

Файл отображался правильно, пока я не переключился с while(myFile.available()) u8x8.print( (char) myFile.read()); на printNewSet(), после чего myFile.read() возвращает только -1, а myFile.available() всегда false .

Что происходит не так?

РЕДАКТИРОВАТЬ: Во время отладки я обнаружил, что myFile не удается инициализировать. Неужели у меня заканчивается память?

, 👍0

Обсуждение

что такое Arduino и каковы сообщаемые значения использования памяти?, @Juraj

Я использую Uno с использованием 54% rom и 62% ram, @Marco Giacomin


1 ответ


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

1

Я случайно закомментировал инициализацию SD вместе с последовательной инициализацией. После раскомментирования он работает правильно

,