利用联合体直接以内存形式无损传输数据

利用联合体直接以原始内存形式无损传输数据

为什么这样做

我们经常需要在上下位机之间传递数值数据,比如使用串口将当前温度传输到计算机中,记录弹珠通过的速度等等…
然而,这些数据有很多是浮点数,这时,我们会这样做:

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中取到那个浮点数了。

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值