SD.remove()

mwklim
Offline
Зарегистрирован: 26.10.2015

Я решил сделать свой проводник на arduino, но сталкнулся с такой проблемой, не получается запустить команду SD.remove(b); просто откидывает в setup и ничего не происходит, но если заменить строку на SD.remove("text.txt"); к примеру, то файл этот удаляется. Подозреваю, что ему не нравится массив b. но в строке myFile = SD.open(b, FILE_WRITE); без проблем создается файл, который я указываю через com порт, либо просто открывает его, если он уже существует. Что я делаю не так?

#include <SPI.h>
#include <SD.h>
int c=0;
int q=0;
int z=0;
String b;
String d;
String f;
char a;
char n[]={'.',' ','~','!','@','#','$','%','^','&','*','(',')','_','+','=','-','[',']',';',':','"','?',',','<','>','/','|','`','{','}',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','I','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'1','2','3','4','5','6','7','8','9','0'};
File myFile;

void setup()
{
  Serial.begin(9600);

if(Serial.read()){
      Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");}}
void loop(){
    z=0;
    com(); 
  if(f=="open "){
    myFile = SD.open(b);
     while (myFile.available()) {
      Serial.write(myFile.read());
    }
    myFile.close();
    myFile = SD.open(b, FILE_WRITE);
    z=1;
  while(myFile) {
    nol();
    com();
    if(c>0){
  if(b=="close file"){
    myFile.close();
    nol();
    z=0;
    return;}
  else{
    Serial.println(b);
    myFile.println(b);}}
}}
   if(f=="remove "){
    while(b==String()){
    SD.remove(b);
    nol();
    return;
   }}
   else{
    nol();}
}
  

void com(){
    while(Serial.available()){
    delay(2);
    a = Serial.read();
  for(q=0;q<94;q++){
    if(a==n[q]){
      d=String(n[q]);
      b=String(b+d);
      if(b=="remove " && z==0){
        f=b;
        b=String();
      }
      else if(b=="open " && z==0){
        f=b;
        b=String();
      }
      c++;}}} 
}
void nol(){
      c=0;
      a=0;
      b=String();
      f=String();}

 

mwklim
Offline
Зарегистрирован: 26.10.2015

53 строчку забыл убрать, она там лишняя, хотя без нее все равно проблема не решилась

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Сколько скетч занимает памяти?

mwklim
Offline
Зарегистрирован: 26.10.2015

1091 bytes 

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

Напечатайте в Serial b перед 54 строкой. Наверняка Вы его уже сбросили nol'ом и там пустая строка вместо имени файла. Наепечатайте и посмотрите.

mwklim
Offline
Зарегистрирован: 26.10.2015

Печатал уже, почему-то печатает половину массива, а затем опять все печатает из setup

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

Что значит "половину массива". Какого массива? Там должно быть имя файла, который Вы собираетесь удалять. Оно печатается?

mwklim
Offline
Зарегистрирован: 26.10.2015

У меня в массив b записывается файл через com порт, например text.txt, через команду SD.open(b); программа без проблем открывает файл, который я указываю, но если даже на место SD.open поставить SD.remove, то уже ничего не работает, даже если перед open поставить serial b, он выводит весь массив b полностью, а если заменить опять же open на remove, то уже печатается не text.txt, а tex, то есть всего часть массива, ну и дальше вся программа отбрасывается в setup

mwklim
Offline
Зарегистрирован: 26.10.2015

изменил код на строке 38, как показано в скетче снизу, до Serial.print(b); не доходит, выбрасывает в setup, даже команда на 34 строке до конца не выполняется, так же часть текста из файла выписывает и все, без SD.remove(b); все работает, весь текст из файла печатается, ничего не выбрасывает

#include <SPI.h>
#include <SD.h>
int c=0;
int q=0;
int z=0;
String b;
String d;
String f;
char a;
char n[]={'.',' ','~','!','@','#','$','%','^','&','*','(',')','_','+','=','-','[',']',';',':','"','?',',','<','>','/','|','`','{','}',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','I','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'1','2','3','4','5','6','7','8','9','0'};
File myFile;

void setup()
{
  Serial.begin(9600);

  
if(Serial.read()){
      Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");}}
void loop(){
    z=0;
    com(); 
  if(f=="open "){
    myFile = SD.open(b);
     while (myFile.available()) {
      Serial.write(myFile.read());
    }
    myFile.close();
     SD.remove(b);
     Serial.print(b);
    myFile = SD.open(b, FILE_WRITE);
    z=1;
  while(myFile) {
    nol();
    com();
    if(c>0){
  if(b=="close file"){
    myFile.close();
    nol();
    z=0;
    return;}
  else{
    Serial.println(b);
    myFile.println(b);}}
}}
   else if(f=="remove "){
    SD.remove(b);
    nol();
    return;
   }
   else{
    nol();}
}
  

void com(){
    while(Serial.available()){
    delay(2);
    a = Serial.read();
  for(q=0;q<94;q++){
    if(a==n[q]){
      d=String(n[q]);
      b=String(b+d);
      if(b=="remove " && z==0){
        f=b;
        b=String();
      }
      else if(b=="open " && z==0){
        f=b;
        b=String();
      }
      else if(b=="read " && z==0){
        f=b;
        b=String();
      }
      
      else if(b=="create " && z==0){
        f=b;
        b=String();
      }
      c++;}}} 
}
void nol(){
      c=0;
      a=0;
      b=String();
      f=String();}

 

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

mwklim пишет:
У меня в массив b записывается файл через com порт, например text.txt, через команду SD.open(b); программа без проблем открывает файл, который я указываю, но если даже на место SD.open поставить SD.remove, то уже ничего не работает, даже если перед open поставить serial b, он выводит весь массив b полностью, а если заменить опять же open на remove, то уже печатается не text.txt, а tex, то есть всего часть массива, ну и дальше вся программа отбрасывается в setup
Бред какой-то. У Вас нет массива b. У Вас есть строка b описанная в строке 6 как

String b;

И в этой строке должно быть имя файла. Всё о чм Вас просят это напечатать это имя, чтобы понять что Вы собираетесь удалять. Вы говорите не работает удаление? Так напечатайте имя файла, который Вы удаляете. ПЕРЕД тем как пытаться удалить, а не после!

mwklim
Offline
Зарегистрирован: 26.10.2015

После того, как я вставляю печать перед удалением, он не печатает b, он сразу же выбивает меня в setup, изредка выводится на печать 2-3 символа строки b, если я ставлю даже 

         myFile = SD.open(b);
33      while (myFile.available()) {
34       Serial.write(myFile.read());
35     }
36

    myFile.close();

перед удалением, он не читает указанный файл, от так же выбивает в setup, но без проблем все выводит, если удаление убрать. 

 

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

1. Что такоа "выбивает в setup"? Как Вы это видите?

2. Вы можете просто показать скетч с печатью перед удалением? До сих пор я такого не видел.

mwklim
Offline
Зарегистрирован: 26.10.2015

Вижу,что туда выбивает благодаря этим строчкам:

21 if(Serial.read()){
22       Serial.print("Initializing SD card...");
23  
24   if (!SD.begin(4)) {
25     Serial.println("initialization failed!");
26     return;
27   }
28   Serial.println("initialization done.");}}

они находятся только в setup, как только программа доходит до удаления, выводятся снова эти строчки, и ничего не удаляется, просто происходит reset какой-то.

Вот скетч с печатью перед удалением. Строка b не обнуляется, она остается такой же, как и в команде SD.open, то есть файл, который я прописываю в com порте открывается, в com пишет сначала название этого файла(эти все действия проделываются начиная со строки 31), потом все содержание этого файла, потом этот файл закрывается, опять же пишет эту строку b, и далее этот файл удаляется(заметим, что строка b не менялась все это время), и опять же прописывается в com строка b, НО у меня почему то после того, как я пытаюсь вывести строку b в com, после закрытия файла, выбрасывает в setup. ECЛИ УБРАТЬ SD.remove(b) в этой части программы, ТО ВСЕ ВЫВОДИТ ПРАВИЛЬНО И НЕ ОБРЫВАЕТСЯ! 

 

#include <SPI.h>
#include <SD.h>
int c=0;
int q=0;
int z=0;
String b;
String d;
String f;
char a;
char n[]={'.',' ','~','!','@','#','$','%','^','&','*','(',')','_','+','=','-','[',']',';',':','"','?',',','<','>','/','|','`','{','}',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z',
'A','B','C','D','E','F','G','H','I','J','K','I','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'1','2','3','4','5','6','7','8','9','0'};
File myFile;

void setup()
{
  Serial.begin(9600);
if(Serial.read()){
      Serial.print("Initializing SD card...");

  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");}}
void loop(){
    z=0;
    com(); 
  if(f=="open "){
    Serial.print(b);
myFile = SD.open(b);
     while (myFile.available()) {
      Serial.write(myFile.read());
    }
    myFile.close();
    Serial.print(b);
    SD.remove(b);
    Serial.print(b);
    }
   else{
    nol();}
}
  

void com(){
    while(Serial.available()){
    delay(2);
    a = Serial.read();
  for(q=0;q<94;q++){
    if(a==n[q]){
      d=String(n[q]);
      b=String(b+d);
      if(b=="remove " && z==0){
        f=b;
        b=String();
      }
      else if(b=="open " && z==0){
        f=b;
        b=String();
      }
      c++;}}} 
}
void nol(){
      c=0;
      a=0;
      b=String();
      f=String();}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ага, понятно, "выбивает" означает. что контроллер перезагружается. Ну, с remove как таковым это никак не связано. 

Обычная причина перезагрузки (кроме аппаратных причин) - недостаток памяти или неправильная работа с памятью. Скорее всего Вы загадили всю память странными манипуляцями с объектом String в функции com. Там Вы для чего-то создаёте 188 объектов String, причём в глобальной куче.

Давайте попробуем так: не вызывайте com() вообще. Присвойте пееременным нужные значения вручную и убедитесь, что в таком виде всё нормально работает.

mwklim
Offline
Зарегистрирован: 26.10.2015

Я взял образец sd files.ino и там прописал String b={"text.txt"} и где нужно указывать имя файла, я указывал строку b, и опять встретился с той же проблемой, open и close работает, а remove нет.

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

На текст скетча можно посмотреть? Или он опять огромный? Сделайте маленький проверочный скетч и выложите его.

mwklim
Offline
Зарегистрирован: 26.10.2015
#include <SD.h>
#include <SPI.h>
String b="text.txt"; 
File myFile;

void setup() { Serial.begin(9600);

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

if (!SD.begin(4)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done.");

if (SD.exists(b)) { Serial.println("example.txt exists."); } else { Serial.println("example.txt doesn't exist."); } Serial.println("Creating example.txt..."); myFile = SD.open(b, FILE_WRITE); myFile.close();

if (SD.exists(b) { Serial.println("example.txt exists."); } else { Serial.println("example.txt doesn't exist."); }

Serial.println("Removing example.txt..."); SD.remove(b);

if (SD.exists(b)) { Serial.println("example.txt exists."); } else { Serial.println("example.txt doesn't exist."); } }

void loop() {

}

 

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

1. И что печатает? Лог-то давайте. чего я всё клещами тяну.

2. Текст вставляйте нормально, так смотреть тяжело.

mwklim
Offline
Зарегистрирован: 26.10.2015

Сегодня я залез в саму библиотеку, разобрал все, что там написано, и натолкнулся на то, что мне как раз нужно, оказывается SD.remove() не принимает значения String, а принимает только значения char*, и из-за этого у меня происходил reset, перевел строку String в char* и все сразу стало работать без проблем. Спасибо, что пытались мне помочь.

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

mwklim пишет:

оказывается SD.remove() не принимает значения String, а принимает только значения char* 

Это не так. По крайней мере у меня в стандартной, поставляемой с IDE библиотеке, она примает и то, и другое:

// Delete the file.
  boolean remove(char *filepath);
  boolean remove(const String &filepath) { return remove(filepath.c_str()); }

 

mwklim
Offline
Зарегистрирован: 26.10.2015

У меня, к сожалению, ввидимо не много другая библиотека