c ++按字节读取struct数据

时间:2014-08-09 19:50:19

标签: c++ struct

我使用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
        }
    }
} 

1 个答案:

答案 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
};