salve a tutti,
Ho un arduino mega e un display nextion.
Ho una pagina dove ci si accede dopo aver inserito una password.
La password è memorizzata dentro la eeprom di arduino.
Per il momento è fissa e ha lunghezza 4 caratteri. ho fatto così:
Nella pagina dove ho l'inserimento password c'è un tastierino e il tasto invia.
Il tasto invia prende quello che ho scritto nel campo TempPassword e lo mette nel buffer di lettura.
poi c'è il confronto carattere per carattere.
questo è lo script:
void bEnterPopCallback(void *ptr)
{
dbSerialPrintln("bEnterPopCallback");
//svuoto il buffer
memset(buffer, 0, sizeof(buffer));
//Scrivo il contenuto della variabile nel buffer
TempPassword.getText(buffer, sizeof(buffer));
//stampo sulla seriale la password inserita
Serial.print("Password Inserita:");
Serial.print(buffer[0]);
Serial.print(buffer[1]);
Serial.print(buffer[2]);
Serial.print(buffer[3]);
Serial.println();
Serial.println(Security,BIN);
//stampo sulla seriale la password in eeprom
Serial.print(EEPROM.read(0));
Serial.print(EEPROM.read(1));
Serial.print(EEPROM.read(2));
Serial.print(EEPROM.read(3));
if (Security == 1 & buffer[0] == EEPROM.read(0) & buffer[1] == EEPROM.read(1) & buffer[2] == EEPROM.read(2) & buffer[3] == EEPROM.read(3))
{
page1.show();
ActualPage = 1;
}
il codice continua ma il problema è in queste righe...
Sulla seriale le variabili sono corrette ma il confronto non va a buon fine.
che diavolo sta succedendo?
avete qualche idea?
il buffer è una array di caratteri char buffer[20] = {0};
c'è qualche problema di conversione perché se creo un array di caratteri: char password[20] = {0};
e ci provo a sposatre dentro i valori memorizzati nella eeprom:
** password[0]=(EEPROM.read(0));**
** password[1]=(EEPROM.read(1));**
** password[2]=(EEPROM.read(2));**
** password[3]=(EEPROM.read(3));**
Secondo me trovi semplicemente i valori che ci hai scritto che ... NON sono caratteri ma **il valore binario 00000001; **se vuoi memorizzare il carattere '1' o, appunto, lo scrivi nella forma '1' (con i singoli apici) o scrivi il suo valore ASCII 0x31.
ohhhhh Grazieeeeee
Avevo immaginato una cosa del genere. scrivevo "1" come si fa di solito con le stringhe...
praticamente vedevo 1 ma era il numero e non il carattere.
fratt:
Nell'if usi uno solo &
Per l'operatore AND logico devi usare &&
Vero, però in questo specifico caso fortuitamente il risultato non cambia. Le singole espressioni relazionali di confronto danno tutte come risultato 0 o 1, e a questo punto usare & o && su sequenze di 0 e 1 non fa differenza (se non nella short-circuit evaluation).
robotronico:
praticamente vedevo 1 ma era il numero e non il carattere
È un errore comune quello di non ricordare che i "caratteri non esistono", ma sono simboli umani rappresentati in memoria con dei codici numerici, in questo caso secondo lo standard ASCII. Poi se scrivere '1', 49, 0b00110001, 0x31, è solo scelta del programmatore. Trattandosi di caratteri la forma '1' è la più chiara
PS:riguardo a: "altavoz es una variabile che no viene puesta a 8 en el codigo", la magia è che le variabili locali non sono inizializzate e possono avere valori casuali, e quindi per puro caso possono assumere il valore "giusto".
robotronico:
Si ti confermo che in questo caso un & è sufficiente.
Si, ma è solo un caso ... sintatticamente, se si deve fare un AND logico (come nel caso degli IF), si DEVE usare &&; quello che stai usando te è un AND binario bit a bit che ha tutt'altro scopo e che, solo per fortuna, nel tuo caso va anche bene.
>robotronico: Quando si quota un post, NON è necessario riportarlo (inutilmente) tutto; bastano poche righe per far capire di cosa si parla ed a cosa ci si riferisce, inoltre, se si risponde al post immediatamente precedente, normalmente NON è necessario alcun "quote" dato che è sottinteso.
Gli utenti da device "mobile" (piccoli schermi) ti ringrazieranno per la cortesia
Guglielmo
P.S.: Ho eliminato io il "quote" dal tuo post #7 poco sopra