Перезапись на SD-карту

lennen
Offline
Зарегистрирован: 10.11.2015

Как записывать на SD карту или удалять с нее файл - знают практически все. А что делать, если мне в таблицу каждые 15 секунд надо перезаписать данные? Вроде в библиотеке нет функции перезаписи или стирания данных. Я бы каретку в начал файла бы переместил, да тоже об этом особо не пишут. Подскажите, пожалуйста?

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

lennen пишет:

Я бы каретку в начал файла бы переместил

Ну и помещайте, кто не даёт-то? У объекта File есть метод seek ( seek(uint32_t pos) ). Параметр - позиция каретки. Поможет ли это Вам, не знаю, но каретку перемещайте куда хотите.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

Апну тему.

Как решили вопрос?

Необходимо на карту памяти перезаписывать переменные раз в 3-5мин. В файле записано такое:

Время работы в скундах; 

15; 

осталось часов до ТО ; 

145;

15 и 145 нужно перезаписывать. Сейчас поступаю так, сначала удаляю файл, затем создаю новый с новыми переменными:

 SD.remove("time_TO.txt");
     // открываем файл, в который будет записана строка
 File dataFile = SD.open("time_TO.txt", FILE_WRITE);

    if (dataFile) {
        // записываем строку в файл
        dataFile.println("Время работы в скундах; ");
        dataFile.print(time_rabot);
        dataFile.println(";");
        dataFile.println("осталось часов до ТО ; ");
        dataFile.print(max_limit-time_rabot);
        dataFile.println(";");
        dataFile.close();
        Serial.println(time_rabot);
    }
    else {
        // выводим ошибку если не удалось открыть файл
        Serial.println("error opening file");
    }

Всё работает. Но в процессе отладки столкнулся с проблемой. если обесточить ардуинку в ненужное время, между удалением и  созданием файла, файл и переменные пропадают.

Может есть какойто вариант при котором переменные просто перезаписываются???

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

- Содаете новый файл с временным именем,

- пишете в него нужную информацию,

- удаляете старый,

- переименовываете новый.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

andriano пишет:

- Содаете новый файл с временным именем,

- пишете в него нужную информацию,

- удаляете старый,

- переименовываете новый.

Проблема остаётся таже. в момент удаляем- переименовываем.

negavoid
Offline
Зарегистрирован: 09.07.2016

sany_sch, а сколько, по-вашему, времени занимает удаление-переименовывание файла, и как вы так точно в эти миллисекунды умудряетесь так часто отключать питание? Может быть, вам не хватает flush() или sync()?

T.Rook
Offline
Зарегистрирован: 05.03.2016

sany_sch пишет:

Проблема остаётся таже. в момент удаляем- переименовываем.

Оставляйте временный. Копируйте в стандартный. Тогда всегда будет либо один, либо оба файла целых. Т.е. максимум - потеря последней записи во временный файл.

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

negavoid пишет:

sany_sch, а сколько, по-вашему, времени занимает удаление-переименовывание файла, и как вы так точно в эти миллисекунды умудряетесь так часто отключать питание? Может быть, вам не хватает flush() или sync()?

Я сам так думал. но вот как раз во время отладки и попал на такое. Правда там перезапись шла через секунду, а не раз в 3-5 мин. Но факт есть факт. А здесь весь смысл в сохранении данных. Поэтому и спросил, возможно есть простое решение задачи.

Сейчас остановился на ведении двух файлов. и при запуске ардуинки в сетапе сравниваю переменные. и выбираю ту что больше (так по скетчу получается).

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

T.Rook пишет:

sany_sch пишет:

Проблема остаётся таже. в момент удаляем- переименовываем.

Оставляйте временный. Копируйте в стандартный. Тогда всегда будет либо один, либо оба файла целых. Т.е. максимум - потеря последней записи во временный файл.

примерно на таком варианте и остановился. Но хочется более простых решений.

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

sany_sch пишет:

andriano пишет:

- Содаете новый файл с временным именем,

- пишете в него нужную информацию,

- удаляете старый,

- переименовываете новый.

Проблема остаётся таже. в момент удаляем- переименовываем.

Это невозможно.

И, кстати, удаляем-переименовываем - это не один момент, а разные. Может, в этом все дело?

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

andriano пишет:

sany_sch пишет:

Проблема остаётся таже. в момент удаляем- переименовываем.

Это невозможно.

И, кстати, удаляем-переименовываем - это не один момент, а разные. Может, в этом все дело?

Я понимаю что разные. Вот мы удалили файл и в этот момент выключилось питание. Временный переименовать не успели. Запустили Ардуинку снова, она открыла файл. Но так как файла нет, она его создала. Всё, все переменные равны 0.

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

Ну а сообразить, что если нет файла со стандартным именем, следует проверить  временным, - не судьба?

sany_sch, честное слово, Вы задаете какие-то детсадовские вопросы, на которые можно найти ответ менее чем за секунду раздумий.

Логика работы контроллера более чем в 90% случаев совпадает с обычной человеческой. Вот что бы сделали лично Вы, если бы обнаружили, что на карточке, где должен быть файл с определенным именем, его нет?

Правильно - написали бы на форум!

 

sany_sch
sany_sch аватар
Offline
Зарегистрирован: 19.01.2016

andriano пишет:

Ну а сообразить, что если нет файла со стандартным именем, следует проверить  временным, - не судьба?

sany_sch, честное слово, Вы задаете какие-то детсадовские вопросы, на которые можно найти ответ менее чем за секунду раздумий.

Логика работы контроллера более чем в 90% случаев совпадает с обычной человеческой. Вот что бы сделали лично Вы, если бы обнаружили, что на карточке, где должен быть файл с определенным именем, его нет?

Правильно - написали бы на форум!

 

Андриано, Вы, наверное, не внимательно читали. Я писал:

<span style="font-size:14.4px;font-weight:700;">sany_sch</span> пишет:

Сейчас остановился на ведении двух файлов. и при запуске ардуинки в сетапе сравниваю переменные. и выбираю ту что больше (так по скетчу получается).

Это примерно то же что и предлагаете вы. То есть выход я нашел. А на форум зашел узнать, нет ли стандартных, более простых решений. Например, изменять не весь файл, а только переменную. Или наличие других библиотек дающих возможность напямую писать и сохранять переменные. Но наверное плохо объяснил, необезсудьте...