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

存储模式

x

0L

0H

1L

1H

小端

x

1H

1L

0H

0L

大端

字节流

发送字节流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]);