SD.remove()
- Войдите на сайт для отправки комментариев
Втр, 27/10/2015 - 00:05
Я решил сделать свой проводник на 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();}
53 строчку забыл убрать, она там лишняя, хотя без нее все равно проблема не решилась
Сколько скетч занимает памяти?
1091 bytes
Напечатайте в Serial b перед 54 строкой. Наверняка Вы его уже сбросили nol'ом и там пустая строка вместо имени файла. Наепечатайте и посмотрите.
Печатал уже, почему-то печатает половину массива, а затем опять все печатает из setup
Что значит "половину массива". Какого массива? Там должно быть имя файла, который Вы собираетесь удалять. Оно печатается?
У меня в массив b записывается файл через com порт, например text.txt, через команду SD.open(b); программа без проблем открывает файл, который я указываю, но если даже на место SD.open поставить SD.remove, то уже ничего не работает, даже если перед open поставить serial b, он выводит весь массив b полностью, а если заменить опять же open на remove, то уже печатается не text.txt, а tex, то есть всего часть массива, ну и дальше вся программа отбрасывается в setup
изменил код на строке 38, как показано в скетче снизу, до Serial.print(b); не доходит, выбрасывает в setup, даже команда на 34 строке до конца не выполняется, так же часть текста из файла выписывает и все, без SD.remove(b); все работает, весь текст из файла печатается, ничего не выбрасывает
String b;
И в этой строке должно быть имя файла. Всё о чм Вас просят это напечатать это имя, чтобы понять что Вы собираетесь удалять. Вы говорите не работает удаление? Так напечатайте имя файла, который Вы удаляете. ПЕРЕД тем как пытаться удалить, а не после!
После того, как я вставляю печать перед удалением, он не печатает b, он сразу же выбивает меня в setup, изредка выводится на печать 2-3 символа строки b, если я ставлю даже
myFile = SD.open(b);
33
while
(myFile.available()) {
34
Serial
.write(myFile.read());
35
}
36
myFile.close();
перед удалением, он не читает указанный файл, от так же выбивает в setup, но без проблем все выводит, если удаление убрать.
1. Что такоа "выбивает в setup"? Как Вы это видите?
2. Вы можете просто показать скетч с печатью перед удалением? До сих пор я такого не видел.
Вижу,что туда выбивает благодаря этим строчкам:
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) в этой части программы, ТО ВСЕ ВЫВОДИТ ПРАВИЛЬНО И НЕ ОБРЫВАЕТСЯ!
Ага, понятно, "выбивает" означает. что контроллер перезагружается. Ну, с remove как таковым это никак не связано.
Обычная причина перезагрузки (кроме аппаратных причин) - недостаток памяти или неправильная работа с памятью. Скорее всего Вы загадили всю память странными манипуляцями с объектом String в функции com. Там Вы для чего-то создаёте 188 объектов String, причём в глобальной куче.
Давайте попробуем так: не вызывайте com() вообще. Присвойте пееременным нужные значения вручную и убедитесь, что в таком виде всё нормально работает.
Я взял образец sd files.ino и там прописал String b={"text.txt"} и где нужно указывать имя файла, я указывал строку b, и опять встретился с той же проблемой, open и close работает, а remove нет.
На текст скетча можно посмотреть? Или он опять огромный? Сделайте маленький проверочный скетч и выложите его.
1. И что печатает? Лог-то давайте. чего я всё клещами тяну.
2. Текст вставляйте нормально, так смотреть тяжело.
Сегодня я залез в саму библиотеку, разобрал все, что там написано, и натолкнулся на то, что мне как раз нужно, оказывается SD.remove() не принимает значения String, а принимает только значения char*, и из-за этого у меня происходил reset, перевел строку String в char* и все сразу стало работать без проблем. Спасибо, что пытались мне помочь.
оказывается SD.remove() не принимает значения String, а принимает только значения char*
Это не так. По крайней мере у меня в стандартной, поставляемой с IDE библиотеке, она примает и то, и другое:
У меня, к сожалению, ввидимо не много другая библиотека