我正在与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上的字节。
答案 0 :(得分:2)
也许写不起作用。每个EEPROM.write()
语句,每the documentation here,需要3.3毫秒才能完成。除了检查Serial.available()
的时间之外,我在代码中看不到任何允许写入正确调整的内容。
还要注意所有AVR芯片&#39; EEPROM支持无限读取,但写入耐久性仅为大约100,000个周期。因此,您应该明智地写入EEPROM的频率。理想情况下,这是针对持久性设置的,并且通常可以读取并且很少写入值。将一堆EEPROM写入快速循环,您可以非常快地超出EEPROM的耐用性。那么EEPROM就毁了你需要一个新的芯片(和引导程序)或一个新的Arduino。我从糟糕的经历中知道这一点。 ;)