在计算机中,数据类型是取决于解码的方式,而在内存中保存的数据,并不会因为解码方式发生改变。
eg:1111 1111 8位数据。当用 uint8_t 来解析时,值为255,而当用 int8_t 来解析时,值为-128。
浮点数:在目前绝大多数机器中,float 类型占据4字节。
我们在利用EEPROM保存浮点数时,实际上就是直接把数据存进去,然后再以 float 类型解析出来。这几种的一个关键的地方,就是在利用I2C发送数据时,利用void *进行强制类型转换,把原来long double和int类型的数据转换成不确定类型的指针。然后一个一个字节的发送就可以。最后,浮点数以%f读出,整数以%d读出。
本博客参考野火stm32的相关代码
/* 精髓在于void *强制类型转换,转成无类型指针 */
/*写入小数数据到地址10*/
I2C_EE_BufferWrite((void*)double_buffer,DOUBLE_ADDR, sizeof(double_buffer));
/*写入整数数据到地址60*/
I2C_EE_BufferWrite((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer));
/* 读出数据的操作也一样,void *类型转换 */
/*读取小数数据*/
I2C_EE_BufferRead((void*)double_buffer, DOUBLE_ADDR, sizeof(double_buffer));
/*读取整数数据*/
I2C_EE_BufferRead((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer));
void * 为 “不确定类型指针”,void *可以用来声明指针。用void* 定义一个void类型的指针,它不指向任何类型的数据,意思是,void*指针“指向空类型”或“不指向确定的类型”,而不要理解为void*指针能指向“任何的类型”数据。简而言之:void*只提供一个地址,没有指向。
#include "stm32f10x.h"
#include "./usart/bsp_usart.h"
#include "./i2c/bsp_i2c_ee.h"
#include "./led/bsp_led.h"
#include uint8_t cal_flag = 0; uint8_t k; /*存储小数和整数的数组,各7个*/ long double double_buffer[7] = {0}; int int_bufffer[7] = {0}; #define DOUBLE_ADDR 10 #define LONGINT_ADDR 70 /** * @brief 主函数 * @param 无 * @retval 无 */ int main(void) { LED_GPIO_Config(); /* 串口初始化 */ USART_Config(); printf("rn 这是一个EEPROM 读写小数和长整数实验 rn"); /* I2C 外设初(AT24C02)始化 */ I2C_EE_Init(); /*读取数据标志位*/ I2C_EE_BufferRead(&cal_flag, 0, 1); if( cal_flag != 0xCD ) /*若标志等于0xcd,表示之前已有写入数据*/ { printf("rn没有检测到数据标志,FLASH没有存储数据,即将进行小数写入实验rn"); cal_flag =0xCD; /*写入标志到0地址*/ I2C_EE_BufferWrite(&cal_flag, 0, 1); /*生成要写入的数据*/ for( k=0; k<7; k++ ) { double_buffer[k] = k +0.1; int_bufffer[k]=k*500+1 ; } /*写入小数数据到地址10*/ I2C_EE_BufferWrite((void*)double_buffer,DOUBLE_ADDR, sizeof(double_buffer)); /*写入整数数据到地址60*/ I2C_EE_BufferWrite((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer)); printf("向芯片写入数据:"); /*打印到串口*/ for( k=0; k<7; k++ ) { printf("小数tx = %LFrn",double_buffer[k]); printf("整数tx = %drn",int_bufffer[k]); } printf("rn请复位开发板,以读取数据进行检验rn"); } else { printf("rn检测到数据标志rn"); /*读取小数数据*/ I2C_EE_BufferRead((void*)double_buffer, DOUBLE_ADDR, sizeof(double_buffer)); /*读取整数数据*/ I2C_EE_BufferRead((void*)int_bufffer, LONGINT_ADDR, sizeof(int_bufffer)); printf("rn从芯片读到数据:rn"); for( k=0; k<7; k++ ) { printf("小数 rx = %LF rn",double_buffer[k]); printf("整数 rx = %d rn",int_bufffer[k]); } } while (1); }
上一篇: stm32专题十四:存储器介绍
下一篇:stm32专题十八:SPI协议
推荐阅读最新更新时间:2024-11-13 11:00
设计资源 培训 开发板 精华推荐
- 一种用于工业的 LED 大功率 LED 驱动器
- NCP1075NONGEVB,使用 NCP1075 单片开关控制器的 8W 双路非隔离评估板
- LT3461AES6 演示板,升压转换器,Vin = 3V - 6V,Vout = 12V,(如果 Vin = 5V,Iout = 70mA)
- OP295GPZ 低噪声单电源前置放大器的典型应用
- 射频按键锁
- TCR5SB45A、150mA、4.5V 输出电压 CMOS 低压降稳压器的典型应用
- AM2G-1224DH30Z ±24V 2 瓦 DC-DC 转换器的典型应用
- #第五届立创电子设计大赛#【美岩电子制作】智能电力检测仪
- 超迷你加热台
- 用于工业应用的 LT3973EMSE-5 3.3V 降压转换器的典型应用