【stm32之间直接传送浮点数的实现方法】

stm32之间直接传送浮点数的实现方法

指针变换

一个变量,如果长度大于一个字节,就可以拆分为多个字节;同时,也可由多个字节合成一个变量。数据传输过程一般就是采用发送端拆分,接收端合成。
其中指针变换语句是核心

int x; 
x=*((int*)&x);

其中x=指向该地址((强制指针类型转换)取地址);
该表达式可以将任意地址的几个字节“识别”为某一个类型的一个量
当识别为大于1字节的变量,即为合成
当识别为char类型(一个字节),即为拆分

小端模式

传送大于一个字节的数据,首先要明白数据在内存中的存储形式,比如传送一个short int,要弄明白高字节在前还是低字节在前;而传送一个浮点数(有4个字节),需要弄清楚它是大端在前还是小端在前,简单的说:也就是高位在前还是低位在前(比如:11111是一万一千一百一十一,还是一十一百一千一万)我们直觉上都默认为大端(高位在前),但是
stm32在储存上采用小端模式

1234.46 IEEE754转换(浮点数16进制)结果为
44 9A 51 EB
然而在stm32内存中储存的浮点数从低地址到高地址为
EB 51 9A 44
大小端颠倒,小端开头
用指针去☞就会发现

float x=1234.56;
x1=*((u8*)&x);
x2=*((u8*)&x+1);
x3=*((u8*)&x+2);
x4=*((u8*)&x+3);
printf("从低地址到高地址:%d,%d,%d,%d",x1,x2,x3,x4);

结果(这里写成了16进制方便看):

从低地址到高地址:EB,51,9A,44

浮点数最低地址最低地址+1最低地址+2最低地址+3存储模式
x0L0H1L1H小端
x1H1L0H0L大端

字节流

发送字节流ABCD,
接受的字节流也是ABCD;
则:
发送的浮点数为大端字节流,接收的也为大端字节流
如果模式不一,则要进行大小端转换。

发送端

stm32收发都是小端储存,将浮点数用切分成字节流发送即可

//44 9A 51 EB (1234.56浮点数转换结果)
	float x=1234.56;
	//stm32采用小端模式
	UpBuff[1]=*((u8*)&x);  //EB
	UpBuff[2]=*((u8*)&x+1);  //51
	UpBuff[3]=*((u8*)&x+2);  //9A
	UpBuff[4]=*((u8*)&x+3);  //44

接收端

注意接收字节流it_msg2中的内容不能直接用指针合成,要用一个静态buf或临时buf来按位转存,再用float指针合成

    float mx;
    u8 xbuf[4];
	xbuf[0]=it_msg2[0];
	xbuf[1]=it_msg2[1];
	xbuf[2]=it_msg2[2];
	xbuf[3]=it_msg2[3];

	mx=*((float*)&xbuf[0]);

  • 8
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值