[Risolto]EEPROM put & get.

Buona domenica a tutti.
Non riesco a leggere correttamente le variabili salvate char .

 String auth1 = myNex.readStr("t0.txt");
  auth1.toCharArray(auth, 32);
  EEPROM.put(add1, auth);
  // EEPROM.get(add1, auth);
  Serial.println(auth);
  String ssid1 = myNex.readStr("t1.txt");
  ssid1.toCharArray(ssid, 32);
  EEPROM.put(add2, ssid);
  // EEPROM.get(add2, ssid);
  Serial.println(ssid);
  String pass1 = myNex.readStr("t2.txt");
  pass1.toCharArray(pass, 32);
  EEPROM.put(add3, pass);

  // EEPROM.get(add3, pass);
  Serial.println(pass);

wingamesyun:
Non riesco a leggere correttamente le variabili salvate char ...

... che vuol dire? Cosa leggi?

Nel calcolo degli indirizzi di EEPROM, tieni conto che le stringhe del 'C' hanno un carattere in più che è il terminatore (0x00) ?

Guglielmo

Allora se faccio subito la lettura con get dove sono commentati le stampa bene ma se riavvio stampa sulla seriale tutte le tre uguali

... gli indirizzi, al riavvio, vengono calcolati bene? ... solo con quel pezzo di codice non si capisce ... ::slight_smile:

Guglielmo

[code]
#include<EEPROM.h>
#define BLYNK_PRINT Serial
#include "EasyNextionLibrary.h"  
EasyNex myNex(Serial1);
#include <SPI.h>
#include <Fishino.h>
#include <BlynkSimpleFishino.h>
char auth[33];
char ssid[32];
char pass[32];
int add1 = 1;
int add2 = 2;
int add3 = 3;
void setup()
{
  // Debug console
  Serial.begin(9600);
  myNex.begin(9600);
  EEPROM.get(add1, auth);
  delay(100);
  EEPROM.get(add2, ssid);
  delay(100);
  EEPROM.get(add3, pass);
  Serial.println(auth);
  Serial.println(ssid);
  Serial.println(pass);
  //Blynk.begin(auth, ssid, pass);

}

void loop()
{
  Blynk.run();
  myNex.NextionListen(); // WARNING: This function must be called repeatedly to response touch events
  // from Nextion touch panel. Actually, you should place it in your loop function.
  Serial.println(auth);
  Serial.println("loop ");
  delay(1000);
}
void trigger1() {
  String auth1 = myNex.readStr("t0.txt");
  auth1.toCharArray(auth, 33);
  EEPROM.put(add1, auth);
  // EEPROM.get(add1, auth);
  Serial.println(auth);
  String ssid1 = myNex.readStr("t1.txt");
  ssid1.toCharArray(ssid, 32);
  EEPROM.put(add2, ssid);
  // EEPROM.get(add2, ssid);
  Serial.println(ssid);
  String pass1 = myNex.readStr("t2.txt");
  pass1.toCharArray(pass, 32);
  EEPROM.put(add3, pass);

  // EEPROM.get(add3, pass);
  Serial.println(pass);
  delay(10000);

}

Completo.[/code]

Ma ti rendi conto ? ? ? :o :o :o

int add1 = 1;
int add2 = 2;
int add3 = 3;

Guglielmo

Ho fatto una prova prima non li avevo inizializzati

Mette sempre il secondo indirizzo a tutti .

Scrivi 3 stringhe lunghe 32/33 caratteri su 3 indirizzi che distano tra loro un solo byte...
La seconda put sovrascrive un pezzo della prima e la terza sovrascrive un pezzo della seconda.
Soluzione complessa: studia bene come funziona il salvataggio in eeprom e quanto "spazio" occupano le varie variabili.
Soluzione ignorante: inizializza add1, add2, add3 con 0, 100, 200

Il problema sta proprio li si sopra scrivevano le stringhe ora funziona .
Ma perchè e una soluzione ignorante? si può fare in un'altro modo?

Certo, si calcola la lunghezza della stringa (nel tuo caso vedo che sono tutte da 32 byte) e si calcola l'indirizzo esatto spenza sprechi ... basta ragionare sul fatto che la EEPROM è come un array che va da 0 a 1023 ...

int add1 =  0;  // si parte dall'indirizzo 0 e si arriva al indirizzo 31 (32 caratteri)
int add2 = 32;  // si parte dall'indirizzo 32 e si arriva all'indirizzo 63 (ulteriori 32 caratteri)
int add3 = 64;  // si parte dall'indirizzo 64 e si arriva all'indirizzo 95 (ulteriori 32 caratteri)

... chiaro che bisogna avere variabili di lunghezza massima determinata.

Per le variabili che NON sono array, la lunghezza è:

byte è lungo 1 byte
int è lungo 2 bytes
long int è lungo 4 bytes
float è lungo 4 bytes

... e così via

Guglielmo

Ho sempre usato il salvataggio nel SD per le Stringhe ma visto che non cambiano quasi mai allora ho pensato di usare l' Eprom.
Capito grazie.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.