Что не так с тем, как я записываю и/или считываю адреса 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 и печатаю переменную.

, 👍2

Обсуждение

Какая проблема у вас на самом деле есть? Вы не включили никакого описания проблемы. Из вашего кода я бы сказал: 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


1 ответ


Лучший ответ:

5

Вы забыли вызвать 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