gpt4 book ai didi

c++ - EEPROM 恢复不工作

转载 作者:行者123 更新时间:2023-11-28 01:46:23 24 4
gpt4 key购买 nike

我正在使用 Arduinos(Nano 板)进行 DIY 项目。我在第一个和第二个 Arduinos 之间的串行通信有问题。第一个 Arduino 向第二个发送一个字符(字母 r),这就是第二个 Arduino 开始从 EEPROM 恢复字节(从 0-25 的字节)的方式。唯一的问题是,第二个 Arduino 没有正确发送字节,或者第一个 Arduino 没有正确存储它们。

第二个Arduino在EEPROM中有默认值:

EEPROMWritelong(EEPROM_DISTANCE, 1500);
EEPROMWritelong(EEPROM_DISTANCE_B, 100);
EEPROMWritelong(EEPROM_DISTANCE_C, 1000);
EEPROMWritelong(EEPROM_DISTANCE_D, 400);
EEPROM.write(EEPROM_MAX_SPEED, 43);
EEPROM.write(EEPROM_TOP_SPEED, 38);
EEPROMWritelong(EEPROM_TRIP_TIME, 1800);
EEPROMWritelong(EEPROM_WOKR_HOURS, 3600);

第二个Arduino中的循环函数:

if (Serial.available()) {
incoming = Serial.read();
if (incoming == 'r') {
uint8_t address = 0;
notSend = 255;
do {
Serial.write(EEPROM.read(address));
address++;
delay(50);
}
while (address < 26);
notSend = 0;
}
}

在第一个 Arduino 上恢复字节的代码:

uint8_t byteCount = 0;
Serial.write('r'); // STARTS RESTORING
do {
if (Serial.available()) {
if (byteCount >= 0 && byteCount <= 17) EEPROM.write(byteCount, Serial.read());
// FROM DISTANCE TO TOP SPEED (BYTES 0 - 17)
else if (byteCount >= 18 && byteCount <= 21) EEPROM.write(byteCount + 8, Serial.read());
// TRIP TIME
else EEPROM.write(byteCount + 16, Serial.read());
// WORK HOURS
byteCount++;
}
}
while (byteCount != 26);

我在这个过程中打印了所有字节,但字节根本不匹配。左侧是从第二个 Arduino 向第一个 Arduino 发送字节,右侧是从第二个 Arduino 在第一个 Arduino 上接收字节。

Serial monitor

最佳答案

也许写入不起作用。每个 EEPROM.write() 语句,根据 the documentation here ,需要 3.3 毫秒才能完成。除了检查 Serial.available() 的时间之外,我在您的代码中看不到任何允许适当调整写入速度的内容。

另请注意,所有 AVR 芯片的 EEPROM 都支持无限次读取,但写入生命周期仅为 100,000 次左右。因此,您应该审慎地判断写入 EEPROM 的频率。理想情况下,这是用于持久设置,并且可以经常读取而很少写入值。将一堆 EEPROM 写入快速循环,您可能会很快超过 EEPROM 的耐久性。然后 EEPROM 损坏,您需要一个新芯片(和引导加载程序)或一个新的 Arduino。我从糟糕的经历中知道这一点。 ;)

关于c++ - EEPROM 恢复不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44889162/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com