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]);