Что не так с тем, как я записываю и/или считываю адреса EEPROM?
Рассмотрим:
#include <EEPROM.h>
byte guifactor1 = 1;
byte guifactor2 = 2;
byte guifactor3 = 3;
byte guifactor4 = 4;
byte guifactorgas = 5;
byte guifactorwater = 6;
volatile unsigned long count1factor;
volatile unsigned long count2factor;
volatile unsigned long count3factor;
volatile unsigned long count4factor;
volatile unsigned long countgasfactor;
volatile unsigned long countwaterfactor;
void loop(){
if (guifactor1 > -1){
EEPROM.write(1, guifactor1);
EEPROM.commit();
count1factor = EEPROM.read(1);
Serial.println(count1factor);
}
if (guifactor2 > -1){
EEPROM.write(2, guifactor2);
EEPROM.commit();
count2factor = EEPROM.read(2);
Serial.println(count2factor);
}
if (guifactor3 > -1){
EEPROM.write(3, guifactor3);
EEPROM.commit();
count3factor = EEPROM.read(3);
Serial.println(count3factor);
}
if (guifactor4 > -1){
EEPROM.write(4, guifactor4);
EEPROM.commit();
count4factor = EEPROM.read(4);
Serial.println(count4factor);
}
if (guifactorgas > -1){
EEPROM.write(5, guifactorgas);
EEPROM.commit();
countgasfactor = EEPROM.read(5);
Serial.println(countgasfactor);
}
if (guifactor1 > -1){
EEPROM.write(6, guifactorwater);
EEPROM.commit();
countwaterfactor = EEPROM.read(6);
Serial.println(countwaterfactor);
}
}
void setup(){
}
Проблема, с которой я сталкиваюсь с моим кодом, заключается в том, что он либо не записывает значение в EEPROM, либо не считывает значение, поскольку ничего не выводит на монитор.
Я ожидал прочитать 1 2 3 4 5 6 с монитора, когда я записываю байты в EEPROM, а затем передаю значение в unsigned long и печатаю переменную.
1 ответ
Лучший ответ:
Вы забыли вызвать Serial.begin()
в setup()
.
В качестве дополнительного примечания, ваши тесты if бесполезны. Компилятор предупреждает меня, что:
comparison is always true due to limited range of data type
Для справки: предыдущий ответ, действительный для первоначального вопроса
, где guifactor1
и co. все они были давно не подписаны
.
Программа ничего не делает, потому что все действия обусловлены такими тестами, как
if (guifactor1 > -1)
и эти тесты всегда ложны. Причина, по которой они являются ложными, заключается в том, что
операторы арифметического сравнения, такие как <
, выполняют обычные арифметические
преобразования для своих операндов перед выполнением фактического
сравнения. Поскольку guifactor1
имеет значение unsigned long
, и этот тип имеет более
высокий ранг преобразования, чем int
(тип -1
), второй операнд
неявно преобразуется в unsigned long
, получая ULONG_MAX
.
это не весь мой код. я не стал загружать все это, потому что это может быть немного перегружено. я отредактировал приведенный выше код, чтобы проблема была немного более понятной, я также изменил длину без знака на байт., @Jay van de Wetering
@JayvandeWetering: Пожалуйста, протестируйте опубликованную вами программу (не ваш исходный код, а точный код, который указан в вашем вопросе, поскольку вы только что внесли в него изменения) и убедитесь, что она действительно показывает неправильное поведение., @Edgar Bonet
я протестировал программу, которую я опубликовал, и она по-прежнему либо не записывает, либо не считывает данные с eeprom, @Jay van de Wetering
@JayvandeWetering: Откуда ты знаешь, что он не пишет или не читает? Пожалуйста, обновите свой вопрос соответствующими подробностями., @Edgar Bonet
я думаю, что я достаточно обновил вопрос, чтобы было ясно, что ожидается и каков фактический результат, @Jay van de Wetering
- esp32 Stack canary watchpoint срабатывает
- Очистка EEPROM
- Почему функция server.on() из "ESPAsyncWebServer.h" выполняется на стороне setup(), а не на стороне loop()?
- ESP32 отправляет данные на другой ESP32 без установления соединения Wi-Fi
- Передача нестатической функции-члена с помощью bind
- Увеличить частоту дискретизации на плате ESP32
- Отправить только один пакет с одного ESP32 на другой ESP32 без подтверждения
- ESP32: лучший способ встраивания сертификатов
Какая проблема у вас на самом деле есть? Вы не включили никакого описания проблемы. Из вашего кода я бы сказал:
guifactor1
и его братья и сестры будут неявно инициализированы нулем (поскольку они являются глобальными, и вы явно не инициализируете их). Проверкаguifactor1> -1
никогда не будет истинной, поскольку вы инициализировали их равными нулю и больше не меняете их, а также они являются `unsigned long', поэтому они никогда не могут иметь отрицательное значение. Вам следует переосмыслить логику вашей программы., @chrislЧто он печатает как
Серийный
?, @Edgar BonetВаше описание проблемы все еще слишком расплывчато. Пожалуйста, точно опишите, что вы ожидали от кода и что он на самом деле сделал. Укажите ожидаемый и фактический результат. И напишите минимальный компилируемый пример кода, который показывает вашу проблему. Мы не можем отлаживать код, который мы не видим, @chrisl
Какой смысл стоит за утверждениями if?
guifactor1
и siblings по-прежнему никогда не могут быть-1
, посколькуbyte
- это то же самое, что иunsigned char
, который также не может содержать отрицательных значений. Кроме того, вы по-прежнему никогда не меняете эти переменные. Так что вы ничего не увидите. Код внутри операторов if никогда не будет достигнут, @chrislвопрос был о чтении и записи в eeprom, я не предоставил весь свой код, и он не закончен, я просто тестировал, @Jay van de Wetering
Если вы спрашиваете только о строках кода, считывающих и записывающих EEPROM, то ответ будет "В этом нет ничего плохого". Проблема должна быть где-то в коде, который вы отказываетесь показывать. И мы просто не можем вам в этом помочь. Наши способности к чтению мыслей ограничены., @chrisl
проблема решена, @Jay van de Wetering
Вы знаете, что EEPROM ограничены по количеству операций записи, не так ли? Поскольку вы записываете данные в EEPROM в цикле без каких-либо задержек, этот код является одним из способов довольно быстрого отключения EEPROM., @Sim Son
Если ваша проблема решена, пожалуйста, отметьте ответ. Или, если он не отвечает на ваш вопрос, напишите свой собственный. Этот сайт призван помочь многим, а не только вам., @the busybee