找回密码
 立即注册
查看: 954|回复: 8

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

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:179
  • 最近打卡:2025-10-15 07:17:39

15

主题

268

回帖

1421

积分

金牌会员

积分
1421
发表于 2024-11-3 20:28:25 | 显示全部楼层 |阅读模式
大家知道浮点数无论双精度还是单精度都占用4个字节,如果需要断电保持数据,最好把它们保存在eeprom中,经过实验可以用下面的程序来做。



unsigned char uid[4];
unsigned char *point1;
float floaa,floab;

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

}
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

317

回帖

1840

积分

金牌会员

积分
1840
发表于 2024-11-3 21:12:30 | 显示全部楼层
用联合体啊
  1. union {
  2.         float Dat_f;
  3.         char Dat_C[4];
  4. }EEProm_Union;
  5. EEProm_Union.Dat_f = 0.1234;
  6. 存取EEProm_Union.Dat_C[0] ~ EEProm_Union.Dat_C[3]
复制代码
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:126
  • 最近打卡:2025-09-03 12:23:58
已绑定手机

60

主题

776

回帖

4025

积分

论坛元老

自定义头衔

积分
4025
发表于 2024-11-3 21:30:37 | 显示全部楼层
也可以void*类型指针直接传,或许是更优雅的做法

把float类型的数据cast成char,这种做法本身是不优雅、不严谨的
联系我请点击左下角的【回复】按钮,否则我收不到消息提
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:386
  • 最近打卡:2025-10-16 14:57:53
已绑定手机

22

主题

280

回帖

1593

积分

金牌会员

积分
1593
发表于 2024-11-3 21:52:54 | 显示全部楼层
REMOVEUNUSED
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:188
  • 最近打卡:2025-10-11 08:46:41
已绑定手机

15

主题

624

回帖

856

积分

高级会员

积分
856
发表于 2024-11-3 22:33:46 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:564
  • 最近打卡:2025-10-16 16:19:54
已绑定手机

41

主题

2444

回帖

2641

积分

荣誉版主

积分
2641
发表于 2024-11-3 22:35:28 | 显示全部楼层
其实,方法很多,指针强制类型转换除了能应付各种单位变量,也可以将结构体类型或大数组写入EEPROM,
共用体(联合体)的优势是简单可靠,易于理解,特别适合严谨的应用和新手小白。
睁开眼睛做场梦~~~
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:160
  • 最近打卡:2025-09-26 11:46:44

0

主题

2

回帖

338

积分

中级会员

积分
338
发表于 2024-11-4 09:12:19 | 显示全部楼层
可以试试联合体
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:148
  • 最近打卡:2025-10-16 13:09:41
已绑定手机

18

主题

502

回帖

1730

积分

金牌会员

积分
1730
发表于 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);
        }
    }

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:466
  • 最近打卡:2025-10-11 08:41:04
已绑定手机

246

主题

348

回帖

1858

积分

金牌会员

积分
1858
发表于 2024-11-8 10:25:37 | 显示全部楼层
直接用结构体
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-10-16 16:44 , Processed in 0.131922 second(s), 103 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表