我正在尝试将 C 中定义的数据结构写入我的 Arduino Uno 板的非易失性存储器,因此结构的值将在电源关闭或重置后保留。据我了解,执行此操作的唯一方法(在草图运行时)是写入 arduino 的 EEPROM。虽然我可以写单个字节(在地址 0 处设置一个值为 1 的字节):
eeprom_write_byte(0,1);
我被困在试图写一个完整的结构:
typedef struct NewProject_Sequence {
NewProject_SequenceId sequenceId;
NewProject_SequenceLength maxRange;
NewProject_SequenceLength minRange;
NewProject_SequenceLength seqLength;
NewProject_SceneId sceneList[5];
} NewProject_Sequence;
由于 EEPROM 的写入限制为 100,000 次,我不想在循环中通过每个字节写入 Arduino,因为这可能会很快用完它。有谁知道这样做的更有效方法,无论是使用 EEPROM,还是在草图运行时有办法写入 PROGMEM?(不使用 Arduino 库,只使用 C)。
已解决 我最终编写了两个自定义函数——eepromWrite 和 eepromRead 。它们在下面列出:
void eepromRead(uint16_t addr, void* output, uint16_t length) {
uint8_t* src;
uint8_t* dst;
src = (uint8_t*)addr;
dst = (uint8_t*)output;
for (uint16_t i = 0; i < length; i++) {
*dst++ = eeprom_read_byte(src++);
}
}
void eepromWrite(uint16_t addr, void* input, uint16_t length) {
uint8_t* src;
uint8_t* dst;
src = (uint8_t*)input;
dst = (uint8_t*)addr;
for (uint16_t i = 0; i < length; i++) {
eeprom_write_byte(dst++, *src++);
}
}
将像这样实现:
uint16_t currentAddress;
struct {
uint16_t x;
uint16_t y;
} data;
struct {
} output;
uint16_t input
eepromWrite(currentAddress, data, sizeof(data);
eepromRead(currentAddress, output, sizeof(data));