前言
昨天总结制作了w25Q128外设的存取,但留下了不能存储double类型的疑问,哎,想了半天,还真让我给我找到了。对于我这种拿来主义,思考原理从来不是现阶段需要考虑的事,能解决问题就先上再说。原理用到再去思考吧。
解决方法
- 这里使用的是联合体的解决方法,第六感告诉我似乎一定还有其他的解决方案,比如改方法代码的uint8_t。
- 首先看一下联合体的定义:联合体也是一种构造数据类型,和结构体类型一样,它也是由各种不同类型的数据组成,这些数据叫作联合体的成员。不同的是,在联合体中,C语言编译系统使用了覆盖技术。联合体的所有成员在内存中具有相同的首地址,共占同一段内存空间,这些成员可以相互覆盖,因此联合体也常常被称作共用体,在不同的时间保存不同的数据类型和不同长度的成员的值。
- 简单地说,这里使用的就是联合体成员在内存中具有相同的首地址
比如:
typedef union{
float f;
char ch[4];
}DataU;
DataU DataTrans;
上面是定义联合体,下面是写入联合体f的值,我们不需要写入f,只需要写入4个ch数组的值,ch数组对应了浮点数的24位,float和char ch[4]使用的是一个空间大小的内存。
DataTrans.f = 0.123;
for (i = 0; i < 4; i++)
{
DataBuffer[i] = DataTrans.ch[i];
}
W25Q128_Write((uint8_t*)DataBuffer,FLASH_SIZE-200,SIZE);
下面是读出f的值,也是借着数组读出,数组赋值好之后,f的值直接就存在了。
W25Q128_Read(datatemp,FLASH_SIZE-200,SIZE);
for(i=0; i<4; i++)
{
DataTrans.ch[i] = datatemp[i];
}
CV[1] = DataTrans.f;
Serial_Printf("%f",CV[1]);
Serial_Printf("\r\n");
结尾
完整代码就不贴了,上一章有完整的读写完整的代码,根据上面的示例,加上联合体的内容,就可以读取了。