利用联合体直接以原始内存形式无损传输数据
为什么这样做
我们经常需要在上下位机之间传递数值数据,比如使用串口将当前温度传输到计算机中,记录弹珠通过的速度等等…
然而,这些数据有很多是浮点数,这时,我们会这样做:
1.将浮点数的小数点后四舍五入(强制转化成int)传输
2.将单位减小/扩大,使得浮点数变为整数再传输
3.上下位机约定好一个系数,真实数值=整数*系数,这时只要传输整数即可。
可以看出:以上三种方式都能在一定程度上解决问题,而且比较通用。
但是,他们要么以精度损失为代价,要么不灵活,上下位机之间都要转换,有没有一种方式直接传输数据,不要损失,也不要较为麻烦的换算呢?有的,使用联合体!
联合体简介(摘自百度)
在进行某些算法的C语言编程的时候,需要使几种不同类型的变量存放到同一段内存单元中。也就是使用覆盖技术,几个变量互相覆盖。这种几个不同的变量共同占用一段内存的结构,在C语言中,被称作“共用体”类型结构,简称共用体,也叫联合体。
怎么理解呢?各种数据类型对外展现了不同的形象,唯一不变的就是它的内存空间的二进制数据始终都是一样的,它们占用的空间也是同一个地方,只是这些二进制数据当你把它看成浮点型的时候,它是浮点数;当你把它看成无符号整数的时候,就是无符号数,或者你把这些数据看成有符号的数据,那么它就是有符号数据。
我们要怎样用
举一个例子吧:
STM32端:
在KEIL中定义一个联合体:
union f_to_char{
u8 chr[4];
float ft0;
}volt_union;
然后在代码中这样赋值:
volt_union.ft0=Get_Adc(0x00)*(3300.0/4096.0);
通过串口发送发送volt_union.chr这个数组里面的数据
PC端:
将串口发过来的四个char按原来的顺序填进去,就可以在volt_union.ft0中取到那个浮点数了。