向24C02芯片中写入浮点数的方法,测试可用!
方法:用共用体
(1)共用体类型定义
#define FLOAT_BYTE_NUM 4 //float类型占用字节数
//浮点数存储共用体
typedef union
{
float value;
uint8_t byte[FLOAT_BYTE_NUM];
} storFloatData;
(2)函数定义
/********************************************************************************************************
函数名称:
函数功能:向指定地址写入1个浮点数
详 述:
输 入:
*********************************************************************************************************/
void Storage_WriteFloatNum( uint16_t addr, storFloatData data )
{
uint8_t i = 0;
uint8_t a = 0;
for( i = 0; i <= FLOAT_BYTE_NUM - 1; i++ )
{
AT24CXX_WriteOneByte( addr + i, data.byte[ i] );
}
return;
}
/********************************************************************************************************
函数名称:
函数功能:从指定地址读出1个浮点数
详 述:
输 入:
*********************************************************************************************************/
storFloatData Storage_ReadFloatNum( uint16_t addr )
{
uint8_t i = 0;
storFloatData read_data;
for( i = 0; i <= FLOAT_BYTE_NUM - 1; i++ )
{
read_data.byte[ i] = AT24CXX_ReadOneByte( addr + i );
}
return read_data;
}
(3)使用例程
storFloatData data0={12.34};
storFloatData data1;
Storage_WriteFloatNum(0,data0);
delay_ms(20);
data1 = Storage_ReadFloatNum(0);
关于存储float浮点数到flash或eeprom中的方法
float 单精度浮点数占用32bit空间,不像存储整型或char型数据那么便捷,我们在存储float数据时就需要先将float数变换一下,变换成数组的格式,这样就方便存储和读取了,具体实现有以下方法:
第一种存储方式(取地址法):
uint8_t datatmp[4]; //定义数组 因为float数据 占4个字节
float s; //这是要存储的浮点数
uint8_t *p; //定义一个u8指针变量
p=(uint8_t*)&s; //取浮点数的地址
memcpy(datatmp,p,4); //拷贝浮点数地址4个字节到数组
这种方式就是用取地址的方式,然后又知道浮点数占用的空间,这样就可以通过拷贝即可将浮点数转移到数组中。第二种存储方式(利用共用体):
Union
{
float x;
uchar s[4];
}F32_Sep;
然后把a的值赋给F32_Sep.x,这样一来其实s[0]对应了浮点数的最高位,s[3]对应其最低位,因此,保存到EEPROM中只需将s[0]~s[3]即可。
这就是利用了共用体共用一段内存的原理,即 float x 和 uchar s[4],使用的是一个空间大小的内存。
将单个字节数据读取到一个float类型的数据中---的几种方法
从串口读取传感器值的时候总是一个一个字节,高八位低八位,需要拼接成一个float或者int的时候,这些方法有用处
1、联合体方式
union
{
float f;
unsigned char x[4];
} data;
data.x[0] = 0xA2;
data.x[1] = 0xA1;
data.x[2] = 0xB2;
data.x[3] = 0xB1;
return data.f;
2、移位
float result;
result=(0xA2<<24)|(0xA1<<16)|(0xB2<<8)|0xB1;
3、不知道怎么命名
float result;
*(char*)&result = 0xA2;
*((char*)&result + 1) = 0xA1;
*((char*)&result + 2) = 0xB2;
*((char*)&result + 3) = 0xB1;
4、数组强制转换
unsigned char b[4]={0xA2,0xA1,0xB2,0xB1};
float result;
result=*((float *)b);
【必读】版权免责声明
1、本主题所有言论和内容纯属会员个人意见,与本论坛立场无关。2、本站对所发内容真实性、客观性、可用性不做任何保证也不负任何责任,网友之间仅出于学习目的进行交流。3、对提供的数字内容不拥有任何权利,其版权归原著者拥有。请勿将该数字内容进行商业交易、转载等行为,该内容只为学习所提供,使用后发生的一切问题与本站无关。 4、本网站不保证本站提供的下载资源的准确性、安全性和完整性;同时本网站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。 5、本网站所有软件和资料均为网友推荐收集整理而来,仅供学习用途使用,请务必下载后两小时内删除,禁止商用。6、如有侵犯你版权的,请及时联系我们(电子邮箱1370723259@qq.com)指出,本站将立即改正。
|