将浮点数写入 EEPROM 将浮点数转换为 uint8_t

问题描述

您好,我有两个简单的函数可以将值写入 EEPROM,但这不能正常工作。我在转换时做错了什么?

HAL_StatusTypeDef writeEEPROMByte(uint32_t address,uint8_t data) {
  HAL_StatusTypeDef  status;
  address = address + EEPROM_BASE_ADDRESS;
  HAL_FLASHEx_DATAEEPROM_Unlock();  //Unprotect the EEPROM to allow writing
  status = HAL_FLASHEx_DATAEEPROM_Program(TYPEPROGRAMDATA_BYTE,address,data);
  HAL_FLASHEx_DATAEEPROM_Lock();  // Reprotect the EEPROM
  return status;
  }

uint8_t readEEPROMByte(uint32_t address) {
  uint8_t data = 0;
  address = address + EEPROM_BASE_ADDRESS;
  data = *(__IO uint32_t*)address;
  return data;
  }

void savetoEEPROM (uint32_t address,float data)
{
    uint8_t *array;
    array = (uint8_t*)(&data);
    for(uint32_t i=0;i<4;i++) //float to array of uint8_t
    {
        writeEEPROMByte(address,array[i]);
    }
}

float loadFromEEPROM (uint32_t address)
{
    float value = 0;
    uint8_t data[3];
    for(uint32_t i=0;i<4;i++) //float to array of uint8_t
    {
        data[i] = readEEPROMByte(i+address);
    }
    value = *(float *)(&data);
    return value;
}

浮点数的输出为 64.00 或 65-70 以获取更大的数字

感谢您的回答。我编辑了函数并更改为双精度,因为我使用了 atof()。但我仍然没有很好的读数, 数据[7-i] = readEEPROMByte(i+address); 给出更好的结果,例如 保存 - 读取 2 - 64,3 - 2112,4 - 4160,

void saveConfigToEEPROM (uint32_t address,double data)
{
    uint8_t *array;
    array = (uint8_t*)(&data);
    for(int i=0;i<8;i++) //float to array of uint8_t
    {
        writeEEPROMByte(address+i,array[i]);
    }
}

double loadConfigFromEEPROM (uint32_t address)
{
    double value = 0;
    uint8_t data[8];
    for(int i=0;i<8;i++) //float to array of uint8_t
    {
        data[i] = readEEPROMByte(address+i);
    }
    value = *(double *)(&data);
    return value;
}

解决方法

在函数 saveToEEPROM 的循环中,您重复覆盖相同的地址。

在 loadFromEEPROM 的循环中,您从 4 个不同的地址读取 4 个字节,但尝试将它们保存在 3 个字节长的缓冲区中。

此外,在 readEEPROMByte 中,您将地址转换为 uint32_t 指针,读取 uint32_t,然后将其作为 uint8_t 返回。这可能是未对齐的读取,这在这个平台上可能没问题(您没有准确指定您正在使用的部分)但为了安全起见并使代码更易于阅读,我只会读取一个字节(强制转换为 uint8_t 指针)。

类似地将字节数组转换为 loadFromEEPROM 中的浮点指针不是一个好习惯,但同样可能仍然没问题。