概述
项目场景:
在灵动MCU平台基于逐飞科技开源的RTT库,将一个float类型的数据变量保存到flash中;
问题描述:
写和读flash数据的函数接口变量类型是uint32类型,如何将float的变量存储进去再取出来还是float类型?
解决方案:
1、定义一个共用体(union)
union{ //不再定义新的变量的话共用体的名字可以省略
uint32 u32;
float floa;
} K,B;
K.floa = 0.831; // 这句话要放在函数里 K.floa就是一个float类型的变量
B.floa = 0.344; // 这句话要放在函数里 B.floa就是一个float类型的变量
//K.uint32就是一个uint32类型的变量
是利用共用体共享同一个内存,通过共用体的不同类型的名字来联系到数据。不过使用起来可能不太方便,移植也不太方便。
2、利用指针+强制转换
float K = 0.831,B = 0.344;
uint32 flash_data[4] = {1,9600,0,0};
//基础知识:&-取地址 *-取数据
flash_data[2] = *(uint32*)&K;//把K的地址取出来强制转化为uint32的指针地址,然后再取uint32指针里的数据
flash_data[3] = *(uint32*)&B;
flash_page_program(FLASH_SECTION_31,FLASH_PAGE_3,flash_data,4); //写入flash的数据
flash_page_read(FLASH_SECTION_31,FLASH_PAGE_3,flash_data,4); //读取保存在flash的数据
K = *(float*)&flash_data[2];//同上;
B = *(float*)&flash_data[2];
来骗,来偷袭编译器。将变量的地址取出来,强制转化为其他类型的指针然后再指向数据。
其原理是指针变量所占的字节是一定的,而声明不同类型的作用是规定指针在内存中每次移动的字节数。通过声明指针类型来告诉指针每次多移动多少个字节来确定变量的值。更多详情请学习参考文章[1]。
总结:
这是我今天遇到的问题,自己敲了一遍。
记之。
串口传输问题
将float类型的数据通过串口传输,可以用上述的方案1也可用也可用上述的方案2。
使用方案2,要注意ARM内存对齐的问题;参考文章:https://blog.csdn.net/l_w_zeng/article/details/72879160
使用方案1,要注意共用体外部声明的问题:
定义共用体,外部声明在 .h文件
//.h文件
union data{ //定义共用体类型
uint8 u32[4];
float floa;
};
extern union data a;//外部声明
//.c文件
union data a;//定义共用体变量
注:关于内存的问题:
float类型所占4字节,包括符号位(1位,第31位),指数位(8位,-126-128,22-30位),尾数位(23位,0-22位);
float a;
/取地址取的是首地址,例:a在内存里的的位置为0x20000018-0x20000022;则指针指向的是0x20000018这个地址;
//小端存储式:大多在X86中
uart1_RX_buffer[3] = *((uint8*)(&a));
uart1_RX_buffer[2] = *((uint8*)(&a)+1);
uart1_RX_buffer[1] = *((uint8*)(&a)+2);
uart1_RX_buffer[0] = *((uint8*)(&a)+3);
uart_putbuff(UART_1,uart1_RX_buffer,4);
//大端存储式:
uart_putbuff(UART_1,(uint8*)(&a),4);
参考文章:
https://blog.csdn.net/ssdsafsdsd/article/details/8093911
https://blog.csdn.net/weixin_33790053/article/details/85977491?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control&dist_request_id=&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-2.control
[1].https://www.cnblogs.com/al-fajr/p/11615404.html
最后
以上就是知性盼望为你收集整理的C语言-将float数据存到flash中项目场景:问题描述:解决方案:总结:串口传输问题的全部内容,希望文章能够帮你解决C语言-将float数据存到flash中项目场景:问题描述:解决方案:总结:串口传输问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复