2017-07-03 147 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