2015-09-16 4 views
5

Я делаю интеллектуальную домашнюю систему с использованием nodeMCU, и мне нужно хранить и извлекать данные из модуля. Я использовал следующую функцию.Сохранение постоянных переменных после перезапуска в NodeMCU

function save_settings(name,value) 
    file.remove(name) 
    file.open(name,"w+") 
    file.writeline(value) 
    file.close() 
end 

Это работает, но это медленно и NodeMCU падает, если я вызвать выше функции быстро ... Иногда требует формат FS, чтобы иметь возможность использовать его снова.

Итак, мой вопрос: есть ли другой способ сделать переменные постоянными между перезагрузками?

+0

Для каждой записи, вероятно, требуется, чтобы блок флеш-памяти был удален и перезаписан, что по своей сути медленнее. Я понятия не имею, почему он сбой, но он может переполнять буфер записи или пытаться стереть/написать страницу, пока такая же операция уже происходит. В любом случае решение может состоять в том, чтобы где-то буферизовать данные в массиве и писать реже. Если этого недостаточно, вам может потребоваться записать на SPE EEPROM или SD-карту :( – user1816847

+0

@ user1816847 Ithx для ответа, но это уже не опция, потому что я уже сделал cuatom pcb для проекта и в настоящее время использую его без функции сохранения ... Все, что я могу сделать сейчас, - это некоторая домашняя реализация функции сохранения нагрузки только с помощью программного обеспечения. –

+0

Я бы рекомендовал удалить файл 'file.remove (name)', поскольку он избыточен с помощью 'file.open' в этом случае из-за режима 'w +', что также может упростить работу, которую FS должен делать, поскольку нет изменений в таблице файлов. –

ответ

4

Я использую последнюю версию прошивки, 0.9.6-dev_20150704, версия с плавающей точкой (https://github.com/nodemcu/nodemcu-firmware/releases)

Этот код занял 62-63 мс, чтобы закончить в первой, и, кажется, добавить несколько долей миллисекунды с каждым последующим запуском кода, после нескольких сотен исполнений, это было почти до 100 мс. Он никогда не падал на меня.

function save_setting(name, value) 
    file.open(name, 'w') -- you don't need to do file.remove if you use the 'w' method of writing 
    file.writeline(value) 
    file.close() 
end 

function read_setting(name) 
    if (file.open(name)~=nil) then 
     result = string.sub(file.readline(), 1, -2) -- to remove newline character 
     file.close() 
     return true, result 
    else 
     return false, nil 
    end 
end 

startTime = tmr.now() 

test1 = 1200 
test2 = 15.7 
test3 = 75 
test4 = 15000001 
save_setting('test1', test1) 
save_setting('test2', test2) 
save_setting('test3', test3) 
save_setting('test4', test4) 

1exists, test1 = read_setting('test1') 
2exists, test2 = read_setting('test2') 
3exists, test3 = read_setting('test3') 
4exists, test4 = read_setting('test4') 

completeTime = (tmr.now()-startTime)/(1000) 
print('time to complete (ms):') 
print(tostring(completeTime)) 
+1

в функции read_setting у вас есть file.readline (значение) - это, вероятно, должен быть просто файл .readline() как значение не должно существовать в этом контексте. – askvictor

+0

Кроме того, я бы добавил проверку, чтобы увидеть, был ли вызов open() успешным - если он возвращает nil, тогда функция read_setting должна возвращать нуль. – askvictor

+0

Спасибо, обновлено отражать ваши очки. – wordsforthewise

3

При обновлении до новой версии (на основе SDK 1.4.0), вы можете использовать слоты rtcmem памяти:

local offset = 10 
local val = rtcmem.read32(offset, 1) 
rtcmem.write32(offset, val + 1) 

Эта память документально сохраняться через глубокий цикл сна; Я обнаружил, что он сохраняется как с аппаратным, так и программным сбрасыванием (но не с питанием на велосипеде).

+0

Пользователь хочет, чтобы он продолжался через силовой цикл, поэтому он пишет в файл. – ambassallo

Смежные вопросы