所有关于电路

ESP32错误的EEPROM.GET值从闪存中读取

Zazas321.

螺纹启动器

Zazas321.

加入2015年11月29日
848.
你好。我有一个程序,在每个重置周期之前,我必须将一些数据保存到EEPROM,我成功写入14个字节:

代码:
void write_14_byte_chunks(int EEPROM_POINTER){if(item_inside.quantity!= last_quantity || new_slave_id!= slave_id || strcmp(item_inside.serial,last_serial)!= 0){serial.println(“旧和新变量之间存在不匹配的不匹配,写EEPROM“);int new_eeprom_pointer =(EEPROM_POINTER * 14);if(item_inside.quantity == 0)EEPROM.WRITESHORT(New_eeProm_Pointer,65535);//这将是eeprom.writeushort(new_eeprom_pointer,item_inside.quantity)ryte 2字节编号。//这将是reryte 2字节数字new_eeprom_pointer + = sizeof(unsigned short); //递增addr by 2 serial.print(写入量=之后的地址);serial.println(new_eeprom_pointer);EEPROM.WRITESTRING(new_eeprom_pointer,item_inside.serial); //这将写入10字节字符串new_eeprom_pointer + = 10;serial.print(“编写序列后的地址=”);serial.println(new_eeprom_pointer);if(new_slave_id == 0){eeprom.write(new_eeprom_pointer,65535); Serial.println("Writing 0xff to eeprom"); } else{ EEPROM.write(new_eeprom_pointer, NEW_SLAVE_ID); new_eeprom_pointer += sizeof(unsigned short);;// increment addr by 2 Serial.print("Address after writing slave id="); Serial.println(new_eeprom_pointer); } EEPROM.commit(); } else Serial.println("No need to write eeprom"); }


我将3个值写入EEPROM:
数量 - 2个字节
serial_number -10字节
device_id - 2字节
因此总共14个字节

对于以下示例,我不向前12个字节(数量和serial_number),但只有2到device_id

1613370545136.png.

将值2写入设备ID后,我可以根据您从上面看到它是徽章的。

重置后,我必须读回我写的值,但是,我无法成功读取EEPROM的值:

我所做的就是:
EEPROM.GET(12,SLAVE_ID);
serial.print(“get =”的“从属id”);
serial.println(slave_id);

结果是:
1613372066075.png.

如果我写入值4,它将读回:
1613372100182.png.

有人可以帮助我明白我的EEPROM在这里发生了什么吗?
Zazas321.

螺纹启动器

Zazas321.

加入2015年11月29日
848.
我还开发了一个程序,仅用于调试此问题:
代码:
/ * EEPROM写入将随机值存储到EEPROM中。当电路板关闭时,这些值将保持在EEPROM中,并且可以通过另一个草图稍后检索。* / #include“EEPROM.H”// EEPROM中的当前地址(即,哪个字节//我们要写入下一步)#define EEPROM_SIZE 4080 CHAR序列[10];int eeprom_pointer = 0;uint16_t slave_id = 0;uint16_t new_slave_id = 0;void setup(){serial.begin(115200);serial.println(“开始......”);if(!eeprom.begin(eeprom_size)){serial.println(“未能初始化EEPROM”);延迟(1000000); } strcpy(serial,"12345678"); //clear_all_eeprom(); //read_12_byte_chunks(); //write_12_byte_chunks(); eeprom_pointer = read_14_byte_chunks(); write_14_byte_chunks(eeprom_pointer); } void loop() { // need to divide by 4 because analog inputs range from } void write_14_byte_chunks(int eeprom_pointer){ int new_eeprom_pointer = (eeprom_pointer*14) ; EEPROM.writeUShort(new_eeprom_pointer, 15); //This will wryte 2 byte number new_eeprom_pointer += sizeof(unsigned short);// increment addr by 2 Serial.print("Quantity written="); Serial.println(15); EEPROM.writeString(new_eeprom_pointer, serial);// this will write 10 byte string new_eeprom_pointer += 10; Serial.print("Serial written="); Serial.println(serial); EEPROM.write(new_eeprom_pointer, 5); Serial.print("slave id written=5"); EEPROM.commit(); } void clear_all_eeprom(){ for(int i=0; i=14){ //The EEPROM chunk is empty Serial.print("Found an empty chunk of EEPROM="); Serial.println(j); if(j>=1) find_last_values((j-1)*14); else find_last_values(0); return j; } } } void find_last_values(int last_eeprom_counter){ uint16_t last_quantity=0; char last_serial[10]; uint16_t last_slave_id1=0; Serial.print("Address of last eeprom start="); Serial.println(last_eeprom_counter); EEPROM.get(last_eeprom_counter,last_quantity); last_eeprom_counter += sizeof(unsigned short); EEPROM.get(last_eeprom_counter,last_serial); last_eeprom_counter += 10; EEPROM.get(last_eeprom_counter,last_slave_id1); Serial.print("Last_quantity = "); Serial.println(last_quantity); Serial.print("Last_serial = "); Serial.println(last_serial); Serial.print("last_slave_id1 = "); Serial.println(last_slave_id1); }

每次重置设备时,我都会编写相同的数据并进展到EEPROM的下一个14字节块。重置后,我返回14bytes并读取最后一个设置值。正如您所看到的,我可以正确地读取数量和序列值,但有些东西不对EEPROM,我无法弄清楚!我打赌它的东西如此愚蠢,我无法注意到!
ericgibbs.

ericgibbs.

加入2010年1月29日
12,426
嗨zazas。
我正在运行的测试中的类似问题,第8行。
E.
代码:
#include  SERIAL.PRINT(“EEPPROM COUNTER =”);serial.println(EEPROM_Counter);if(EEPROM_COUNTER> = 996)EEPROM_Counter = 0;EEPROM.WRITEUSHORT(EEPROM_COUNTER,ITEM_INSIDE.QUANTITY);// 2 ^ 16  -  1 EEPROM_Counter + = Sizeof(无符号短);serial.print(“数量之后的”地址=“);serial.println(EEPROM_Counter);EEPROM.WRITESTRING(EEPROM_COUNTER,ITEM_INSIDE.SERIAL);EEPROM_Counter = EEPROM_COUNTER + 10;serial.print(字符串=“之后的”地址“); Serial.println(eeprom_counter); //UPDATE THE eeprom counter EEPROM.write(0,eeprom_counter); EEPROM.commit(); ESP.restart();
Zazas321.

螺纹启动器

Zazas321.

加入2015年11月29日
848.
现在一切都很好。写入EEPROM时需要非常谨慎地了解变量的类型。如果您使用EEPROM.WRITEUSHORT,您必须确保您已将变量声明为uint16_t,否则将发生奇怪的事情!
螺纹启动器 类似的线程 论坛 答案 日期
L. 通用电子聊天 0.
T. 电力电子产品 11.
C 微控制器 1
C 微控制器 4.
Zazas321. 编程语言 47.
最佳