接上文的保存类定义如下
// 保存和读取配置
class CConfigMgr
{
bool m_bMotify = false;
String m_strSSID, m_strPSW;
// 从EEPROM读取配置文件addr为保存配置文件地址
bool Init()
{
/*
uint16_t uint16_t content----------------------content---------
magic_num config_size ssid psw other------------uint8_t--ssidsize ssid uint8_t--pswsize password
*/
Serial.println("开始读取配置文件");
uint16_t magic_num;
EEPROM.begin(sizeof(magic_num));
if (EEPROM.get(0, magic_num) != CONFIG_MAGIC_NUM)
{
Serial.println("非法的配置文件");
return false;
}
// 正常的配置文件读取配置文件尺寸
uint16_t config_size = 0;
EEPROM.begin(sizeof(magic_num) * 2);
EEPROM.get(sizeof(config_size), config_size);
if (config_size > 0)
{
// 真实尺寸
EEPROM.begin(sizeof(magic_num) * 2 + config_size);
const uint8_t *pCur = EEPROM.getDataPtr();
pCur += sizeof(magic_num) * 2;
uint8_t stringsize = pCur[0];
pCur++;
if (stringsize > 0 && stringsize <= MAX_SSID_SIZE)
{
char *ssid = new char[stringsize + 1];
m_strSSID.reserve(stringsize);
memcpy(ssid, pCur, stringsize);
ssid[stringsize] = '\0';
m_strSSID = ssid;
delete[] ssid;
pCur += stringsize;
Serial.print("ssid:");
Serial.print(stringsize);
Serial.print("------");
Serial.println(m_strSSID);
}
stringsize = pCur[0];
pCur++;
if (stringsize > 0 && stringsize <= MAX_PSW_SIZE)
{
char *psw = new char[stringsize + 1];
memcpy(psw, pCur, stringsize);
psw[stringsize] = '\0';
m_strPSW = psw;
delete[] psw;
Serial.print("psw:");
Serial.print(stringsize);
Serial.print("------");
Serial.println(m_strPSW);
}
return true;
}
return false;
}
public:
CConfigMgr()
{
Init();
}
~CConfigMgr()
{
if (m_bMotify)
{
SaveConfig();
}
}
void SaveConfig()
{
uint16_t needsize = 0;
needsize += 2; // 两个uint8_t的尺寸
needsize += m_strSSID.length() + m_strPSW.length();
uint16_t magic_num = CONFIG_MAGIC_NUM;
EEPROM.begin(sizeof(magic_num) * 2 + needsize);
EEPROM.put(0, magic_num);
EEPROM.put(sizeof(uint16_t), needsize);
uint8_t *pCur = EEPROM.getDataPtr();
pCur += sizeof(magic_num) * 2;
pCur[0] = (uint8_t)m_strSSID.length();
pCur++;
memcpy(pCur, m_strSSID.begin(), m_strSSID.length());
pCur += m_strSSID.length();
pCur[0] = (uint8_t)m_strPSW.length();
pCur++;
memcpy(pCur, m_strPSW.begin(), m_strPSW.length());
EEPROM.end();
}
void SetSSID(const char *SSID)
{
if (SSID)
{
m_strSSID = SSID;
}
else
{
m_strSSID.clear();
}
m_bMotify = true;
}
void SetPSW(const char *PSW)
{
if (PSW)
{
m_strPSW = PSW;
}
else
{
m_strPSW.clear();
}
m_bMotify = true;
}
const String &SSID()
{
return m_strSSID;
}
const String &PSW()
{
return m_strPSW;
}
bool IsValid()
{
return !(m_strSSID.isEmpty() || m_strPSW.isEmpty());
}
private:
};
当然这是完全硬解,主要是说明其用法,这里只保存了两个数据SSID和密码。这里可以参见这个方法把它做成更通用方法。