我使用Visual Studio Micro C ++编写Arduino Mega1280 AVR。
我将所有混合类型配置参数保存在4096字节EEPROM中保留的结构中(除了保存在EEPROM中的其他信息)。
对于每个新程序上传,我希望针对EEPROM保存配置检查新配置,我逐字节地进行检查,仅更新不同的EEPROM字节。
我的问题是,虽然代码编译好,(没有错误/警告)我没有得到我期望的结果,并且当按字节读取结构时,我只获得了预期信息的一部分。我需要帮助才能使其正常工作。谢谢。
这是我的简化代码:
#include <avr\eeprom.h>
#include <EEPROM.h>
#include <Arduino.h>
char configVersion[5] = "VS41";
unsigned int deviceID = 0xF0F0;
char deviceRev[5] = "ABCD";
char revDate[11] = "09-08-2014";
unsigned int dataArraySize = 150;
struct defineConfigs {
char configVersion[5];
unsigned int deviceID;
char deviceRev[5];
char revDate[11];
unsigned int dataArraySize;
byte mode;
byte refpage;
byte tolerance;
byte externalTrigger;
byte laserEnable;
}
configData=
{
{configVersion[5]},
deviceID,
{deviceRev[5]},
{revDate[11]},
dataArraySize,
1,
2,
0,
0,
0
};
unsigned int configBaseAddress=3840; //0x0F00
void Setup()
{
loadConfig(configBaseAddress);
}
void loadConfig(int configAddress) //EA
{
int s;
for ( s=0; s<sizeof(configData); s++) {
// Serial.println(*((char*)(&configData) + s),HEX); //Serial.print(","); //for testing
if (*((char*)(&configData) + s) == EEPROM.read(configAddress + s)) {
} else {
EEPROM.write(configAddress + s, *((byte*)(&configData) + s));
Serial.println(EEPROM.read(configAddress + s),HEX);
//read back for testing
}
}
}
答案 0 :(得分:0)
configData的初始化使用未初始化的数据
{configVersion[5]}
指向数组configVersion [0 ... 4]之后的第一个字符。这不像你期望的那样的字符串&#34; VS41&#34;。 您可以检查此打印configData.configVersion:
printf("%s\n", configData.configVersion);
尝试修改configData初始化,如下所示:
struct defineConfigs {
char configVersion[5];
unsigned int deviceID;
char deviceRev[5];
char revDate[11];
unsigned int dataArraySize;
byte mode;
byte refpage;
byte tolerance;
byte externalTrigger;
byte laserEnable;
} configData = {
"VS41",
deviceID,
"ABCD",
"09-08-2014",
dataArraySize,
1,
2,
0,
0,
0
};