我把读写的ROM区从0开始写,每次读写都 正常,只是出现如下的提示。说明的确是内存冲突,只是数据的确会在过程 中被改写。
如果把地址改到从高位开始,怎么都 读写不正常上。不管是地址从4096开始,8192开始。每次写是第一个标志位flag=1,读出来都是0
下面是代码。功能上是在设备没有配置时,进入SmartConfig模式,当配置完成后,把配置完成的标志位置1,把SSID和password都存
到EEPROM里云。然后重启动,或用户按了我自定义的RESET键就重新启动,读出EEPROM里的帐号和密码进行连接,进入工作模式。
看了很多贴子有关于这个问题的,但似乎都 没办法解决我的困惑。这个程序,在用BLYNK时一直是正常上的。用了BLINKER以后,就一直是上述的情况。
#define BLINKER_WIFI
#define BLINKER_PRINT Serial
#include <EEPROM.h>
#include <ESP8266WiFi.h>
#include <Blinker.h>
#define RESETUP 5 //D1 INPUT_PULLUP 中断 重置和重启
#define DEFSSID "win-elf"
#define DEFPSK "4096"
#define EEPROMBase //Blinker 要占用0-1279??
char auth[] = "???";
//initializ EEPROM's address and variable
int RelativeAddress=0;
int flag; //whether users have input the ssid and password .flag=0 or flag=1
const char* ssid = DEFSSID;
const char* pass = DEFPSK;
String myssid;
String mypass;
//resetup按键的中断处理程序
ICACHE_RAM_ATTR void resetup(){
if (times>=2){ //该处理是担心2还没有来得及执行,因按键原因又来一个中断出现times=2传入中断。
times=1; //当times=2传入后,在这里强制变成1,从头开始算按键时间
}else{
times++;
}
Serial.print("中断启动"+String(times));
if (times==1){
timer1=millis();
Serial.println("timer1="+String(timer1));
}
if (times==2){
timer2=millis();
Serial.println("timer2="+String(timer2));
Serial.println("(timer2-timer1)/1000="+String((timer2-timer1)/1000));
}
/////////////////////
//Cpu will be restart when the time of touched is less than 3 second
if (times==2 && ((timer2-timer1)/1000)<3){
Serial.println("《《《《按了重启键,重启》》》》");
ESP.restart();
}
//8266 will be reset when the time of touched is more than 3 second
if (times==2 && ((timer2-timer1)/1000)>=3){
//flag=0 ssid='0' pass='0'
//把wifi帐号密码存入EEPROM 中
flag=0;
RelativeAddress=0; // 相对地址
char ssid32[32];
myssid=" "; //32个空格
mypass=" "; //11个空格
strcpy(ssid32,myssid.c_str()); //把string赋给char[]
char pass11[11];
strcpy(pass11,mypass.c_str());
if (EEPROM_write(flag,ssid32,pass11,RelativeAddress))
{
Serial.println("《《《《清空配置,重启》》》》");
ESP.restart(); //重启,可用
} else {
Serial.println(">>>>>>存入EEPROM异常!!!>>>>>>>>");
}
}
/////////////////////
}
void dataRead(const String & data)
{
BLINKER_LOG("Blinker readString: ", data);
Blinker.vibrate();
uint32_t BlinkerTime = millis();
Blinker.print("millis", BlinkerTime);
}
void myHeartBeat(){
texCondition.print("在线状态");
//低电压检测
if (!digitalRead(LOWVOLTAGE)){
//通知APP
texEnergy.print("电量低请充电");
}else {
texEnergy.print("电池电量正常");
}
}
boolean EEPROM_write(int flag,char ssid[],char pass[],int address)
{
EEPROM.begin(128);
address=EEPROMBase+address;
EEPROM.write(address,flag);
for (int i=0;i<strlen(ssid);i++){ //32位长
address++;
EEPROM.write(address,ssid);
}
for (int j=0;j<strlen(pass);j++){//11位长
address++;
EEPROM.write(address,pass[j]);
}
EEPROM.end();
delay(1000);
return(true);
}
String EEPROM_read(int address,int number){
String result;
address+=EEPROMBase;
EEPROM.begin(128);
for (int i=0;i<number;i++){
result=result+EEPROM.read(address);
address++;
}
EEPROM.end();
return (result);
}
void SmartConfig(){
WiFi.mode(WIFI_STA);
Serial.println("\r\nWait for Smartconfig...");
WiFi.beginSmartConfig();
while (1)
{
Serial.print(".");
light(1); //delay(500); wait for a second
if (WiFi.smartConfigDone())
{
//把wifi帐号密码存入EEPROM 中
flag=1;
RelativeAddress=0;
char ssid32[32];
strcpy(ssid32,WiFi.SSID().c_str()); //把string赋给char[]
char pass11[11];
strcpy(pass11,WiFi.psk().c_str());
if (EEPROM_write(flag,ssid32,pass11,RelativeAddress))
{
for (int i=0;i<3;i++){ //提示灯
light(2);
delay(800);
}
ESP.restart(); //重启,可用
} else {
Serial.println(">>>>>>存入EEPROM异常!!!>>>>>>>>");
}
////////////////
break;
}
}
}
void setup()
{
// Initialize
Serial.begin(115200);
EEPROM.begin(128);
flag=EEPROM.read(EEPROMBase);
EEPROM.end();
Serial.print("EEPROM flag:");
Serial.println(flag);
if (flag !=1)
{
// IF flag!=1 then set 8266 in SmartConfig model .
Serial.println("<<<<<<<现在是【配置】模式>>>>>>>");
SmartConfig();
// Blinker.begin(auth);
}
if (flag==1)
{
myssid=EEPROM_read(1,32); //从第一位读32位
myssid.trim();
mypass=EEPROM_read(33,11); //从第33位读11位
mypass.trim();
Serial.println("登入的SSID是:"+myssid+"密码是:"+mypass);
ssid = myssid.c_str(); //把string 赋给 char*
pass = mypass.c_str();
Serial.println("执行BLinker.begin()");
BLINKER_DEBUG.stream(Serial);
//BLINKER_DEBUG.debugAll();
Blinker.begin(auth,ssid,pass);
Blinker.attachData(dataRead);
Serial.println("<<<<<<<现在是正常【运行】模式>>>>>>>");
delay(1000); //开机灯亮一秒后,关闭
light(0);
}
}
void loop()
{
Blinker.run();
}
|