liuzonggong 发表于 2024-11-3 20:28:25

可以这样在eeprom中保存浮点数

大家知道浮点数无论双精度还是单精度都占用4个字节,如果需要断电保持数据,最好把它们保存在eeprom中,经过实验可以用下面的程序来做。



unsigned char uid;
unsigned char *point1;
float floaa,floab;

void PassNumber()
{
floaa=56.2345;
point1=(char*)&floaa;
uid=*point1;
point1++;
uid=*point1;
point1++;
uid=*point1;
point1++;
uid=*point1;
//在此处将uid数组存到pporom断电(略)
//再次来电后
//再开机从epprom中去除数据到数组(略)
point1=(char*)&floab;
*point1=uid;
point1++;
*point1=uid;
point1++;
*point1=uid;
point1++;
*point1=uid;
floaa=floab;

}

Lkck8210 发表于 2024-11-3 21:12:30

用联合体啊
union {
        float Dat_f;
        char Dat_C;
}EEProm_Union;

EEProm_Union.Dat_f = 0.1234;

存取EEProm_Union.Dat_C ~ EEProm_Union.Dat_C

VCC 发表于 2024-11-3 21:30:37

也可以void*类型指针直接传,或许是更优雅的做法

把float类型的数据cast成char,这种做法本身是不优雅、不严谨的

邮箱 发表于 2024-11-3 21:52:54

{:4_250:}

wlhet 发表于 2024-11-3 22:33:46

谢谢分享

晓飛飛 发表于 2024-11-3 22:35:28

其实,方法很多,指针强制类型转换除了能应付各种单位变量,也可以将结构体类型或大数组写入EEPROM,
共用体(联合体)的优势是简单可靠,易于理解,特别适合严谨的应用和新手小白。

CBQFffdge 发表于 2024-11-4 09:12:19

可以试试联合体

bkeuqoaq 发表于 2024-11-8 09:50:51

本帖最后由 bkeuqoaq 于 2024-11-8 09:52 编辑

实际做法是将所有要保存的变量放在结构体中,,存储整个结构体(将整个结构体当成字节数组),读取时也是类似,连续读取EEPROM数据到结构体首地址,不需要其它特殊操作了

      if (EEPROM_SaveStruct() == 1)
      {
                OLED_ShowStrCpl(128-11*6, 7, "SAVE-1", 0xffff);
                INT_TickDelay(500ms);
                OLED_ShowStr(128-11*6, 7, "      ");
      }
      else
      {
                OLED_ShowStrCpl(128-11*6, 7, "SAVE-0", 0xffff);
                INT_TickDelay(500ms);
                OLED_ShowStr(128-11*6, 7, "      ");
      }


u8 EE_Restore(void)
{
    if (1)
    {
      MenuSet_Typedef* pTask = &g_stMenuSet;
      AT24X_Read(ADDR__MENU_SET, sizeof(g_stMenuSet), (u8*)pTask);
      if (pTask->ulInitFlag != EE_INIT_OK_FLAG__MENU)
      {
            EE_ResetMenuSet(0);
      }
    }

QQ624353765 发表于 2024-11-8 10:25:37

直接用结构体
页: [1]
查看完整版本: 可以这样在eeprom中保存浮点数