2017-07-03 106 views
0

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

第二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; 
    } 
    } 

代码:

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

+0

偏旁主题:通过制作和使用函数来处理endian交换,可以消除大量重复的代码。 – user4581301

+0

@ user4581301你看到我不喜欢的东西? – SilvioCro

+0

我想我明白你的意思了。谢谢! – SilvioCro

回答

2

也许写不工作。每EEPROM.write()声明,每the documentation here需要3.3毫秒完成。我没有看到代码中的任何内容允许对写入进行适当的调整,而不是检查Serial.available()的时间。

另外请注意,所有AVR芯片的EEPROM都支持无限次读取,但写入次数只有大约100,000次。所以你应该明白你写入EEPROM的频率。理想情况下,这是针对持久性设置的,值通常可以被读取并且很少被写入。把一堆EEPROM写入一个快速循环,你可以很快超过EEPROM的耐久性。然后,EEPROM被破坏,你需要一个新的芯片(和引导程序)或新的Arduino。我从不好的经历中知道这一点。 ;)

+0

所以我应该使用延迟? – SilvioCro

+0

为了确保写入有效,您需要某种延迟,是的。注意我介绍给你的文档在最后一行中有没有延迟?您需要一些延迟来确保有效的写入。 – TomServo

+0

我尝试了5ms到250ms之间的延迟。只有一次是良好的交流。 – SilvioCro