/**** 这是通过TCP连接发送命令控制读写 ****/
uint32 value;
/**保护写 数据1***/
if (strcmp(pdata, "a0012") == 0) {
os_printf("nok 012n");
uint8* addr_case1 = (uint8*)&value;
addr_case1[0] = 221;
addr_case1[1] = 145;
addr_case1[2] = 108;
addr_case1[3] = 26;
//写入数据,十六进制0x8c=140,表示140扇区
system_param_save_with_protect(0x8C, (uint32*)addr_case1, sizeof(addr_case1));
os_printf("@@@@@@xie_ru@@@@@:%d %d %d %drn", addr_case1[0], addr_case1[1], addr_case1[2], addr_case1[3]);
}
/**保护写 数据2***/
if (strcmp(pdata, "a0013") == 0) {
uint8* addr_case1 = (uint8*)&value;
addr_case1[0] = 223;
addr_case1[1] = 95;
addr_case1[2] = 108;
addr_case1[3] = 26;
//写入数据,十六进制0x8c=140,表示140扇区
system_param_save_with_protect(0x8C, (uint32*)addr_case1, sizeof(addr_case1));
os_printf("@@@@@@xie_ru@@@@@:%d %d %d %drn", addr_case1[0], addr_case1[1], addr_case1[2], addr_case1[3]);
}
/**保护读(与保护写对应) 数据***/
if (strcmp(pdata, "a0014") == 0){
//读取数据,十六进制0x8c=140,表示140扇区,0 是需读取数据,在 sector 中的偏移地址
system_param_load(0x8C, 0, (uint32*)addr_case1, sizeof(addr_case1));//读取flash值
os_printf("@du_qu@:%d %d %d %drn", addr_case1[0], addr_case1[1], addr_case1[2], addr_case1[3]);
}
/**用常规读取方式,读取140扇区的数据***/
if (strcmp(pdata, "a0015") == 0){
spi_flash_read(140*4096, (uint32*)addr_case1, sizeof(addr_case1));//读取flash值
os_printf("@du_qu@:%d %d %d %drn", addr_case1[0], addr_case1[1], addr_case1[2], addr_case1[3]);
}
/**用常规读取方式,读取141扇区的数据***/
if (strcmp(pdata, "a0016") == 0){
spi_flash_read(141*4096, (uint32*)addr_case1, sizeof(addr_case1));//读取flash值
os_printf("@du_qu@:%d %d %d %drn", addr_case1[0], addr_case1[1], addr_case1[2], addr_case1[3]);
}
经测验,在写入2次数据后,140,141都对应存在写入的数据1和数据2。用system_param_load读取数据,它会根据142扇区数据自动读取140或141的数据。
Flash掉电记录数据读写结构体
//Flash读写定义变量
/****************** struct 创建结构体 *******************************************************************
struct du_xie_shu_ju_01 {
uint8 *zhang_hao[32]; //*zhang_hao[32]的指针变量(输入字符串需要)[]里需要是4的倍数,表示多少字节
uint8 *mi_ma[64];
uint32 id[4];
} shuju_zu_01 ;
struct du_xie_shu_ju_01 shuju_zu_02;//给结构体一个变量名shuju_zu_02,一般用在具体使用的时候
struct 关键字
du_xie_shu_ju_01 结构体名
shuju_zu_01 结构体变量1
shuju_zu_02 结构体变量2
结构体成员的获取 结构体变量名.成员名;
记住:指针用 = 赋值。数组用strcpy赋值
************************************* *******************************************************************/
struct du_xie_shu_ju_01 {
uint8 *zhang_hao[32]; //字符串
uint8 *mi_ma[64]; //字符串
uint32 id[4]; //整形
} shuju_zu_01 ;//给结构体一个变量名shuju_zu_01,并对内容赋值
struct du_xie_shu_ju_01 shuju_zu_02;//给结构体一个变量名shuju_zu_02,一般用在多次调用的函数外,不然结果有变化(不清楚原因)
static void ICACHE_FLASH_ATTR
tcp_client_recv_cb(void *arg,char *pdata,unsigned short len){
os_printf("tcp client receive tcp server datarn");//21
os_printf("length: %d rndata: %srn",len,pdata);//22
/********************指针**********************************
& 获取变量内存地址
* 获取内存地址的值
uint8* addr_case1等价于 uint8 *addr_case1
uint8* addr_case1 char类型的指针变量
&value 变量value的内存地址
(uint8*) 强制类型转换指针
记住:指针用 = 赋值。数组用strcpy赋值
**********************************************************/
//strcmp比较字符串str1和str2是否相同。如果相同则返回0
if (strcmp(pdata, "a0017") == 0){
shuju_zu_01.zhang_hao[32] = "cccooxxx"; //结构体成员的获取和赋值,只能在函数体内
shuju_zu_01.mi_ma[64] = "cxshn1234er567890";
shuju_zu_01.id[4] = system_get_chip_id();
spi_flash_erase_sector(139);
spi_flash_write(139 * 4096, (uint32*)&shuju_zu_01, sizeof(shuju_zu_01));//写入flash
os_printf("@@@@@@xie_ru@@@@@:%s %s %drn", shuju_zu_01.zhang_hao[32], shuju_zu_01.mi_ma[64], shuju_zu_01.id[4]);
}
if (strcmp(pdata, "a0018") == 0) {
//struct du_xie_shu_ju_01 shuju_zu_02;//如果声明在这里,a0020的第3个结果会出错,放在函数外就正常
shuju_zu_02.zhang_hao[32] = "bbcxcxcx"; //结构体成员的获取和赋值,只能在函数体内;
shuju_zu_02.mi_ma[64] = "ecxf125318090";
shuju_zu_02.id[4] = system_get_chip_id();
spi_flash_erase_sector(139);
spi_flash_write(139 * 4096, (uint32*)&shuju_zu_02, sizeof(shuju_zu_02));//写入flash
os_printf("@@@@@@xie_ru@@@@@:%s %s %drn", shuju_zu_02.zhang_hao[32], shuju_zu_02.mi_ma[64], shuju_zu_02.id[4]);
}
if (strcmp(pdata, "a0019") == 0) {
spi_flash_read(139 * 4096, (uint32*)&shuju_zu_01, sizeof(shuju_zu_01));//读取flash值
os_printf("@du_qu@:%s %s %drn", shuju_zu_01.zhang_hao[32], shuju_zu_01.mi_ma[64], shuju_zu_01.id[4]);
}
if (strcmp(pdata, "a0020") == 0) {
//struct du_xie_shu_ju_01 shuju_zu_02;
spi_flash_read(139 * 4096, (uint32*)&shuju_zu_02, sizeof(shuju_zu_02));//读取flash值
os_printf("@du_qu@:%s %s %drn", shuju_zu_02.zhang_hao[32], shuju_zu_02.mi_ma[64], shuju_zu_02.id[4]);
}
现在还有个问题没弄明白,
a0017执行后,执行a0019结果正常,然后执行a0020结果错误。结果集中第3个就是芯片ID那个参数错误。
a0018执行后,执行a0020结果正常,在执行a0019同样结果正常,然后在执行a0020结果错误。结果集中第3个就是芯片ID那个参数错误。继续执行a0019结果正常。
以后在解决这个问题,现在没头绪。另外:必须先写入数据,在读取数据,如果从来没有写入过数据,直接取读取芯片会不停重启
笔记中参考并引用了下面几个大神的博文:
ESP8266 Flash的分布及其读写操作
ESP8266学习笔记(2)——内存分布及Flash读写接口
Esp8266 进阶之路24【高级篇】