Внутренний EEPROM UNO "чтение" возвращает неправильные значения, когда он предшествует "записи".
Я преподаватель Arduino и готовил некоторые материалы по использованию внутреннего EEPROM Arduino UNO, когда столкнулся с проблемой. Проблема в том, что я пытаюсь показать исходное значение в определенном месте EEPROM с помощью функции EEPROM.read, затем я записываю новое значение в это место с помощью функции EEPROM.write и пытаюсь прочитать его снова, пожалуйста, взгляните на его код, я использую последовательный монитор для печати этих значений.
#include <EEPROM.h>
void setup() {
Serial.begin(9600);
// Выведите на последовательный монитор значение, считанное с адреса 20. "Что должно быть 255"
Serial.println(EEPROM.read(20));
// Запишите в EEPROM значение 143 в адресе 20.
EEPROM.write(20, 143);
// Выведите на последовательный монитор значение, считанное с адреса 20. "Что должно быть 143"
Serial.println(EEPROM.read(20));
}
void loop() {
}
Теперь я уже проверил, что это местоположение имеет значение 255, используя другой скетч, который в основном ничего не делает, кроме печати содержимого EEPROM на последовательном мониторе.
#include <EEPROM.h>
void setup() {
Serial.begin(9600);
for(int i = 0; i < 1024;i++)
{
Serial.print("Address: ");
Serial.print(i);
Serial.print(", Value: ");
Serial.println(EEPROM.read(i));
}
}
void loop() {
}
Так в чем же моя проблема? Моя проблема в том, что в моем первом скетче функция EEPROM.read не возвращает 255, вместо этого она возвращает значение 143, которого даже не должно быть до следующей инструкции. Я знаю, что EEPROM.запись занимает около 3,3 мс, и запись-это то, что изнашивает ячейку EEPROM, но я также знаю, что чтение занимает примерно 0 мс и не изнашивает ячейку EEPROM. Несмотря на это, я намеренно поставил "задержку(100)"; после прочтения все еще нет результата.
#include <EEPROM.h>
void setup() {
Serial.begin(9600);
// Print to the Serial Monitor the value read from address 20. "Which should be 255"
Serial.println(EEPROM.read(20));
delay(100);
// Write to the EEPROM the value 143 in address 20.
EEPROM.write(20, 143);
// Print to the Serial Monitor the value read from address 20. "Which should be 143"
Serial.println(EEPROM.read(20));
}
void loop() {
}
Более того, когда я полностью удаляю EEPROM.write из кода и использую EEPROM.только для чтения, я считываю правильные результаты, но, конечно, я также меняю адрес, чтобы проверить его.
Моя установка такова: 64-разрядная версия Windows 10 Pro. Arduino IDE 1.8.15 Версия клона Arduino UNO в Китае. (не SMD)
Мой вопрос в том, что я здесь делаю не так? У меня есть неправильное понимание чего-то здесь? Я уже работал с EEPROMs (как внутренними, так и внешними) с использованием микроконтроллеров PIC18F, поэтому мой опыт (который может быть неверным) показывает, что этот скетч должен работать идеально.
Заранее спасибо.
2 ответа
Лучший ответ:
Это НЕ мой ответ, это ответ @Gerben, спасибо.
Среда IDE Arduino приостанавливает последовательное соединение во время загрузки, а затем возобновляет работу по завершении. Похоже, они добавили некоторую задержку перед повторным открытием последовательного соединения. Таким образом, похоже, что ваш код будет выполняться дважды, даже если вы держите последовательную консоль открытой
@Gerben должен ответить на этот вопрос. Ваша задача-принять его ответ., @SBF
Я согласен, если он опубликует ответ, я обязательно приму его, вот почему я не принял свой ответ., @Abd-AlRahman Muhammad
Согласно документации по адресу:https://www.arduino.cc/en/Ссылка/EEPROMWrite Запись EEPROM занимает 3,3 мс для завершения. Что говорит нам о том, что вы должны дать ему это количество времени или больше, чтобы завершить операцию. Вставьте задержку после "EEPROM.запись(20, 143);" не менее 3,3 мс или delay(3300);. Это должно решить вашу проблему. Вы также можете использовать это, чтобы ваши ученики прочитали руководство. Представить как проблему, чтобы они могли попытаться ее решить. Как только вы попадетесь на это (как и все мы), вы никогда не забудете.
Прочитайте вопрос более внимательно. Проблема заключается в том, что "EEPROM.read ()" происходит _без_ " EEPROM.write ()". Добавление задержки _after_ EEPROM.write()
ничего не изменит., @Edgar Bonet
- Ошибка при вводе EEPROM.read() и EEPROM.write()
- avrdude ser_open() can't set com-state
- Как читать и записывать EEPROM в ESP8266
- Float печатается только 2 десятичных знака после запятой
- ошибка: espcomm_upload_mem failed при загрузке скетча
- Печать массива байтов на экране последовательного монитора Arduino IDE
- Разные и самые быстрые способы вычисления синусов и косинусов в Arduino
- Arduino IDE Отказано В Разрешении На Загрузку, Ubuntu
Попробуйте добавить "задержка(5000);" в начале
настройка
. Я думаю, что происходит следующее: вы загружаете свой код. После загрузки код будет запущен немедленно. Затем вы открываете последовательную консоль. **Открытие последовательной консоли сбрасывает Arduino**. Итак, теперь код запускается во второй раз и будет отображать уже записанные данные EEPROM., @GerbenОтличная интерпретация, но поскольку я в этом не новичок, я никогда не закрываю свою последовательную консоль, чтобы не сбрасывать Arduino, она всегда открыта даже перед загрузкой кода, однако я попробовал, и это действительно сработало. Но почему?, @Abd-AlRahman Muhammad
Среда IDE Arduino приостанавливает последовательное соединение во время загрузки, а затем[resumes](https://github.com/arduino/Arduino/blob/c33fb9fde3cdd6c5d6629fa2a672ef19c110902a/app/src/processing/app/Editor.java#L2105) когда закончите. Похоже, они добавили некоторую задержку перед повторным открытием последовательного соединения. Таким образом, похоже, что ваш код будет выполняться дважды, даже если вы держите последовательную консоль открытой., @Gerben
Большое вам спасибо за ваши разъяснения и ваше время., @Abd-AlRahman Muhammad