2015-09-16 8 views
5

Ich mache ein Smart-Home-System mit NodeMCU, und ich muss Daten aus dem Modul speichern und abrufen. Ich habe folgende Funktion benutzt.Variablen nach einem Neustart auf NodeMCU persistent machen

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

Es funktioniert, aber es ist langsam und die NodeMCU stürzt ab, wenn ich die obige Funktion schnell auslösen ... Manchmal ein FS-Format erfordert, um es wieder zu verwenden.

Meine Frage ist also: Gibt es eine andere Möglichkeit, Variablen zwischen Neustarts persistent zu machen?

+0

Bei jedem Schreibvorgang muss wahrscheinlich ein Flash-Block gelöscht und neu geschrieben werden, was von Natur aus langsam ist. Ich habe keine Ahnung, warum es abstürzen würde, aber es könnte den Schreibpuffer überfüllen oder versuchen, eine Seite zu löschen/zu schreiben, während die gleiche Operation bereits stattfindet. In jedem Fall kann die Lösung darin bestehen, die Daten in einem Array irgendwo zwischenzuspeichern und weniger oft zu schreiben. Wenn das nicht gut genug ist, müssen Sie möglicherweise auf eine SPI EEPROM oder SD-Karte schreiben :( – user1816847

+0

@ user1816847 Ithx für die Antwort, aber das ist keine Option mehr, weil ich bereits eine Cuatom-Platine für das Projekt gemacht und es derzeit ohne die Speicherfunktion verwendet ... Alles, was ich jetzt tun kann, ist ein Heimgerät, das eine sichere Ladefunktion nur durch Software implementiert. –

+0

Ich würde empfehlen, 'file.remove (name)' zu entfernen, da es in diesem Fall redundant mit 'file.open' ist aufgrund des 'w +' Modus Dies kann auch die Arbeit der FS zu tun haben, da es keine Änderung an der Dateitabelle gibt –

Antwort

4

ich die neueste Firmware bin mit, 0.9.6-dev_20150704, der Schwimmer Version (https://github.com/nodemcu/nodemcu-firmware/releases)

Dieser Code 62-63 ms nahm zunächst zu vervollständigen, und scheint ein paar Bruchteile einer Millisekunde hinzufügen Mit jedem weiteren Durchlauf des Codes, nach einigen hundert Ausführungen, waren es fast 100 ms. Es ist mir nie abgestürzt.

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

in der Funktion read_setting, haben Sie file.readline (Wert) - dies sollte wahrscheinlich nur Datei sein .readle() als Wert sollte in diesem Kontext nicht vorhanden sein. – askvictor

+0

Außerdem würde ich eine Überprüfung hinzufügen, um festzustellen, ob der Aufruf von open() erfolgreich war - wenn es nil zurückgibt, sollte die Funktion read_setting null zurückgeben. – askvictor

+0

Danke, aktualisiert reflektieren deine Punkte. – wordsforthewise

3

Wenn Sie auf die neuere Version (basierend auf SDK 1.4.0) aktualisieren Sie die rtcmem Speicherplätze verwenden können:

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

Diese Erinnerung durch einen tiefen Schlaf-Zyklus zu beharren dokumentiert; Ich habe festgestellt, dass es sowohl bei Hardware- als auch bei Software-Resets bestehen bleibt (aber nicht beim Einschalten).

+0

Der Benutzer möchte, dass es durch einen Neustart bleibt, deshalb schreibt er in Datei. – ambassallo