1

我有一个问题:我可以从我的阁楼读取 EEPROM,但我不能在里面写东西。

这是我的代码:

#include <EEPROM.h>

int addr = 0;
int val = 2;
    
void setup()
{
}
    
void loop()
{
  EEPROM.write(addr, val);
      
  addr = addr + 1;
  if (addr == 512)
    addr = 0;
}

编辑

现在我的写代码是:

#include <EEPROM.h>

int addr = 0;
int val = 2;

void setup()
{
}

void loop()
{
  EEPROM.write(addr, byte(val));
  
  addr = addr + 1;
  if (addr == 512)
    while(1);
}

我的阅读代码:

int address = 0;
byte value;

#include <SoftwareSerial.h>

void setup()
{
  SSerial.begin(9600);
}

void loop()
{
  value = EEPROM.read(address);
  
  SSerial.print(address);
  SSerial.print("\t");
  SSerial.print(value, DEC);
  SSerial.println();
  
  address = address + 1;
  
  if (address == 512){
    address = 0;
    delay(100000000);
  }
}

我总是只得到 255 的价值。在每个地址上。现在我将我的 int 转换为字节。在我的情况下,我的 int 不会超过 255。

顺便说一句:我可以创建一个 int 作为字节吗?所以我可以像普通的int一样使用它,但是可以直接写吗?

4

2 回答 2

1

您正在写一个字节,而 anint是两个字节。您可以将EEPROM.get()&EEPROM.put()用于更大的类型(读/写仅处理单个字节)。

#include <EEPROM.h>
int addr = 0;
int val = 2;

void setup(){}

void loop(){

  //Write value
  EEPROM.put(addr, val);

  //Read value
  EEPROM.get(addr, val);

  addr += sizeof(int);  //Increment cursor by two otherwise writes will overlap.

  if(addr == EEPROM.length())
    addr = 0;
}

正如 Vladimir Tsykunov 提到的,此测试代码可能对您的 EEPROM 不利,因为它会在运行时循环多次。一次迭代后停止循环可能会更好:

  if(addr == EEPROM.length())
    while(1); //Infinite loop
于 2016-04-03T22:27:09.030 回答
0

尽量不要在循环中写 eeprom,我想,eeprom 的写/读周期数是有限的。您应该显示您在终端中读取和写入的值。

于 2016-04-03T16:36:10.733 回答