Hola que tal, necesito comparar los datos almacenados en la EEPROM del ATMEGA328 con una cadena de texto pero me es imposible, logro compara los bytes, memoria por memoria pero no me es viable, necesito crear una cadena de caracteres "texto" para poder comparar un numero telefónico recibido con un modulo SIM800l, logro ver la cadena de caracteres de la EEPROM pero me es imposible hacer la comparación entre ambas variables. He utilizado String, byte, int y char pero nada.
El siguiente es un de los varios códigos que utilice:
String quienllama[13];
for (i = 0; i < 14 ; i += sizeof(char)) {
quienllama += (char)EEPROM.read(i);
cadena += quienllama;
}
Moderador:
Por favor, lee las Normas del foro y edita tu código/error usando etiquetas de código.
Ve a edición, luego selecciona todo el código que has publicado, lo cortas y click en </>
Ademas de tener en cuenta que si usas español escribe en el foro en español y solo postea en el foro en inglés si usas ese idioma.
Es mas ni siquiera comentarios en español puedes tener en tu sketch que serás movido a esta sección. Se considera que es un código de otro lenguaje. A tener en cuenta.
Ahora edita usando etiquetas.
Que raro que con EEPROM.get no te funcione!
Aca te dejo un código que si funciona, uso string o sea cadenas no Strings
#include <EEPROM.h>
//0123456789012
char quienllama[] = "0123456789012\0";
char queLeo[14];
int address = 0;
void setup() {
Serial.begin(115200);
EEPROM.put(address, quienllama);
Serial.println("Guardo en EEPROM");
Serial.println(quienllama);
delay(2000);
// leo todo de una vez
Serial.println("Leo desde la EEPROM");
EEPROM.get(address, queLeo);
Serial.println(queLeo);
int res = strtok(quienllama, queLeo);
if (!res)
Serial.println("Son iguales");
else
Serial.println("Son distintos");
}
void loop() {
}
La respuesta del monitor serie es
Guardo en EEPROM
0123456789012
Leo desde la EEPROM
0123456789012
Son iguales
Version 2: con String
#include <EEPROM.h>
//0123456789012
String quienllama = {"0123456789012"};
String queLeo;
int address = 0;
void setup() {
Serial.begin(115200);
EEPROM.put(address, quienllama);
Serial.println("Guardo en EEPROM");
Serial.println(quienllama);
delay(2000);
// leo todo de una vez
Serial.println("Leo desde la EEPROM");
EEPROM.get(address, queLeo);
Serial.println(queLeo);
if (quienllama == queLeo)
Serial.println("Son iguales");
else
Serial.println("Son distintos");
}
void loop() {
}
Hola, en primer lugar me disculpo porque es la primera vez que escribo por acá.
Probé su código pero no funciono, hice este arreglo para que vea de que se trata:
#include <EEPROM.h>
//0123456789012
char quienllama[] = "0123456789013\0"; **// Aquí modifique el numero**
char queLeo[14];
int address = 0;
void setup() {
Serial.begin(9600);
// EEPROM.put(address, quienllama);
//Serial.println("Guardo en EEPROM");
Serial.println("Leo Variable");
Serial.println(quienllama);
delay(2000);
// leo todo de una vez
Serial.println("Leo desde la EEPROM");
EEPROM.get(address, queLeo);
Serial.println(queLeo);
int res = strtok(quienllama, queLeo);
if (!res)
Serial.println("Son iguales"); **// Este es el resultado que arroja**
else
Serial.println("Son distintos");
El primer código
El segundo no lo pruebo porque es lo mismo.
corrido en un nano (Old Bootloader).
Mi Monitor Serie en 115200
Tu lo tienes en
9600
Ya veo que el segundo esta en 9600.
A ver el segundo.
El segundo tmb esta en 115200. No se si tomaste alguna versión intermedia. yo voy respondiendo y cambiando mi posteo.
La única forma que logro de comparar la variable con la EEPROM, es leyendo cada segmento de la memoria y comparando el byte, de otra forma no tengo un resultado satisfactorio
Primero que nada, claro que puedes seguir con el tema el día que quieras, es más, cualquier duda con este asunto va aquí, no abras otro tema nuevo.
Ahora, dejemos claro que ambos códigos que te adjuntó @Surbyte funcionan perfectamente.
Por otro lado, que tu Nano (al igual que los que tengo yo) tenga el bootloader "viejo" solo influye al momento que la IDE sube el código a la placa, pero el código que se sube al micro es exactamente el mismo con ese bootloader o el nuevo.
Por un lado, aclaras que en tu código cambiaste el número de ejemplo
char quienllama[] = "0123456789013\0"; // Aquí modifique el numero
pero luego no lo guardas
// EEPROM.put(address, quienllama);
//Serial.println("Guardo en EEPROM");
porque comentaste la línea que lo hace.
Entonces, si lo que hay en la eeprom es el número que puso de ejemplo @Surbyte obviamente no va a coincidir con el número modificado porque uno termina en 12 y el nuevo en 13.
Por otro, más allá de que es rarísima la salida que obtienes en la consola, me llama la atención ver cadenas que no hay en el código, como por ejemplo "COINCIDE:" e "IDE:", entre otras.
¿Estás probando el código tal como te lo pasó @Surbyte o lo agregaste a un código tuyo?
Puedes mañana, puedes dentro de 1 semana, hasta dentro de 4 o mas meses.
A ver, estoy exagerando, pero lo primero es que no seas impaciente, como decía mi abuela "No se ganó Zamora en 1 hora".
Asi que si estas empezando con Arduino es normal que muchas cosas luzcan como que no funcionan, o no tengan el mismo resultado que el que te he mostrado.
Pero se paciente, revisa cada paso y verás que lo resolverás con perseverancia.
Voy a explicar desde el inicio que es lo que necesito para que ustedes puedan comprender exactamente cuál es el error.
Mi proyecto consiste en una placa de maniobras (ya creada y probada) para abrir y cerrar portones automaticos, con múltiples funciones entre ellas, recibir una llamada para activar la placa, también funciona con telecomando. El problema de la EEPROM radica en que necesito realizar una comparación de cadena de datos entre un número telefónico almacenado en la memoria antes mencionada y el número recibido por la SIM800L. En resumen, existe una diferencia de tipo de datos entre la EEPROM leída y el texto recibido por el SIM800L aunque ambos se lea en el monitor serie correctamente e iguales, a simple vista se lee texto.
A la pregunta de porque comente esta línea:
// EEPROM.put(address, quienllama);
Porque anteriormente almacene el número telefónico real para poder realizar las comparaciones entre ambas variables (la variable simula la SIM800L) que se supone son diferentes más sin embargo con este código siempre dice que son iguales, a diferencia de otros códigos que probé que siempre decían que eran diferentes.
Ahora bien, antes de escribir por acá ya había encontrado una solución pero no es muy cómoda que digamos porque puedo comparar memoria por memoria (13 campos), es decir, leer la información de la memoria y la información recibida por la SIM800L ambos en bytes y compararlos caracter por caracter, evidentemente se requiere escribir un poco más de código para lograr lo que necesito.
Espero de verdad haber aclarado mi idea y posteriormente a ver si ustedes pueden ayudarme.
Aclarar has aclarado y bueno lo que yo te puse fueron datos en EEPROM porque no los tenia y claramente puedes comentarlos porque lo que quieres hacer es compararlo y esta bien.
El SIM800L no es buena idea para un proyecto, la Red 2G esta desapariendo asi que tienes un dilema etico si me permites o bueno, tal vez ya lo sepas y no te importa. No te juzgo solo lo menciono.
El ejemplo con String olvídalo. No funciona bien. Lo acabo de comprobar.
Usa el otro con cadenas strings.
A caramba, no sabia que la SIM800L trabajaba solo a 2g, como es quad band no me preocupe en investigar, de lo contrario hubiese elegido otro mas actualizado, sim embargo en mi caso no es tan problemático ya que la placa trabaja solo con llamadas y SMS.
Gracias por ponerme al corriente.
Entiendo que el valor de res debe ser =0 en cualquier numero o texto, de ser así y según la prueba que acabo de hacer, me debería funcionar con el código original del programa, de esta manera y agradeciendo todo tu tiempo, me despido, este código lo adaptaré para el otro programa y lo probare.
Una vez mas muy agradecido. Saludos y un abrazo fuerte.
Busca la función strcmp y veras que entrega
0 cuando ambas cadenas son iguales
negativo si la primer cadena es menor que la segunda y obviamente distintas.
positivo si la primer cadena es mayor que la segunda y de nuevo distintas.
Muchas gracias, eso me dio la idea de manejar la información de diferente manera, no necesariamente hay que comparar los datos iguales sino simplemente una suma o resta de valores.