Вопрос по SD.exists()

rene
Offline
Зарегистрирован: 21.01.2014

Доброго времени суток!

Подскажите пожалуйста, почему так работает:

if (SD.exists("Temp")) Serial.println("File Temp is exists");

А при использовании строки нет:

String filename = "Temp";
if (SD.exists(filename)) Serial.println("File Temp is exists");

Контроллер постоянно перезагружается. Я так понимаю причина в том, что в массиве строк символом окончания является код 0х0, а в строке 0х10, 0х13?

 

Araris
Offline
Зарегистрирован: 09.11.2012

Попробуйте

String filename = "Temp";
char charfilename[filename.length()+1];
filename.toCharArray(charfilename, sizeof(charfilename));
if (SD.exists(charfilename)) Serial.println("File Temp is exists");

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Araris пишет:

Попробуйте

String filename = "Temp";
char charfilename[filename.length()+1];
filename.toCharArray(charfilename, sizeof(charfilename));
if (SD.exists(charfilename)) Serial.println("File Temp is exists");

 

Araris, по идее должен и String кушать. Там перегрузка определена:

  boolean exists(char *filepath);
  boolean exists(const String &filepath) { return exists(filepath.c_str()); }

Так что надо смотреть остальной скетч на предмет памяти и прочих приятностей.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rene пишет:

Я так понимаю причина в том, что в массиве строк символом окончания является код 0х0, а в строке 0х10, 0х13?

Не выдумывайте. Где Вы эти символы в Вашем примере увидели?

Что компилятор про память говорит?

rene
Offline
Зарегистрирован: 21.01.2014

Почему то подумал что в конце строки используются символы перевода карретки CF, LF, ошибся.

Памяти у меня еще много: Global variables use 2 174 bytes (26%) of dynamic memory, leaving 6 018 bytes for local variables. Maximum is 8 192 bytes.

Специально накатал тестовый скетч, после которого ардуина уходит в бесконечный ребут:

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

void setup() {
  Serial.begin(9600);
  pinMode(53, OUTPUT);
  Serial.print("Initializing SD card...");
  if (!SD.begin(4)) Serial.println("initialization failed!");

  String filename = "1.tmp";
  if (SD.exists(filename)) {
    Serial.println("File of " + filename + " is exists. Remove this file\n");
    //SD.remove(filename);
  }
}

void loop() {
}

Может конечно у меня просто глаза замылились, и я в упор не замечаю ошибки?

rene
Offline
Зарегистрирован: 21.01.2014

Araris пишет:

Попробуйте

String filename = "Temp";
char charfilename[filename.length()+1];
filename.toCharArray(charfilename, sizeof(charfilename));
if (SD.exists(charfilename)) Serial.println("File Temp is exists");

Да, так работает, спасибо!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

rene пишет:

Да, так работает, спасибо!

Но, разобраться, почему не работает так, как у Вас, всё равно надо. Чуть попозже я доберусь до ардуины - отпишусь.

Добрался. Странно, но у меня как-то работает :(

rene
Offline
Зарегистрирован: 21.01.2014

У меня IDE 1.6.5, а у вас?