EEPROM恢复不起作用

时间:2017-07-03 15:21:29

标签: c++ arduino

我正在与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上的字节。

Serial monitor

1 个答案:

答案 0 :(得分:2)

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

还要注意所有AVR芯片&#39; EEPROM支持无限读取,但写入耐久性仅为大约100,000个周期。因此,您应该明智地写入EEPROM的频率。理想情况下,这是针对持久性设置的,并且通常可以读取并且很少写入值。将一堆EEPROM写入快速循环,您可以非常快地超出EEPROM的耐用性。那么EEPROM就毁了你需要一个新的芯片(和引导程序)或一个新的Arduino。我从糟糕的经历中知道这一点。 ;)