前言:
在串口、IIC、SPI等数据传送时基本上都是一次传送一个字节的数据,如果要传送浮点数据?
通常是将浮点数乘以一个倍数,如10,100,1000,10000等,然后将其转换为整型数据再转化为单个字节进行传送。如果这个数据是要进行显示的话,那么这样做并没有什么不好。但是如果这个数是要传输给另端进行继续计算的话,那么就要考虑另一种方法了,就是直接将浮点数据转换为4个单字节,在另一端接受完数据后再转化为浮点数据,这种方式不会造成精度的丢失,计算量也比较小。
程序源码:
[cpp] [cpp]
[cpp]
- #include <stdio.h>
- /*
- 要点提示:
- 1. float和unsigned long具有相同的数据结构长度
- 2. union据类型里的数据存放在相同的物理空间
- */
- typedef union
- {
- float fdata;
- unsigned long ldata;
- }FloatLongType;
- /*
- 将浮点数f转化为4个字节数据存放在byte[4]中
- */
- void Float_to_Byte(float f,unsigned char byte[])
- {
- FloatLongType fl;
- fl.fdata=f;
- byte[0]=(unsigned char)fl.ldata;
- byte[1]=(unsigned char)(fl.ldata>>8);
- byte[2]=(unsigned char)(fl.ldata>>16);
- byte[3]=(unsigned char)(fl.ldata>>24);
- }
- /*
- 将4个字节数据byte[4]转化为浮点数存放在*f中
- */
- void Byte_to_Float(float *f,unsigned char byte[])
- {
- FloatLongType fl;
- fl.ldata=0;
- fl.ldata=byte[3];
- fl.ldata=(fl.ldata<<8)|byte[2];
- fl.ldata=(fl.ldata<<8)|byte[1];
- fl.ldata=(fl.ldata<<8)|byte[0];
- *f=fl.fdata;
- }
- /*
- 测试函数
- */
- int main()
- {
- float f=123456.789f;
- unsigned char byte[4]={0};
- printf("float data=%f ",f);
- Float_to_Byte(f,byte);
- f=789.123456f;
- printf("changed float data=%f ",f);
- Byte_to_Float(&f,byte);
- printf("float data=%f ",f);
- return 0;
- }
[cpp] #include /* 要点提示: 1. float和unsigned long具有相同的数据结构长度 2. union据类型里的数据存放在相同的物理空间 */ typedef union { float fdata; unsigned long ldata; }FloatLongType; /* 将浮点数f转化为4个字节数据存放在byte[4]中 */ void Float_to_Byte(float f,unsigned char byte[]) { FloatLongType fl; fl.fdata=f; byte[0]=(unsigned char)fl.ldata; byte[1]=(unsigned char)(fl.ldata>>8); byte[2]=(unsigned char)(fl.ldata>>16); byte[3]=(unsigned char)(fl.ldata>>24); } /* 将4个字节数据byte[4]转化为浮点数存放在*f中 */ void Byte_to_Float(float *f,unsigned char byte[]) { FloatLongType fl; fl.ldata=0; fl.ldata=byte[3]; fl.ldata=(fl.ldata<<8)|byte[2]; fl.ldata=(fl.ldata<<8)|byte[1]; fl.ldata=(fl.ldata<<8)|byte[0]; *f=fl.fdata; } /* 测试函数 */ int main() { float f=123456.789f; unsigned char byte[4]={0}; printf("float data=%f ",f); Float_to_Byte(f,byte); f=789.123456f; printf("changed float data=%f ",f); Byte_to_Float(&f,byte); printf("float data=%f ",f); return 0; }
运行结果:
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/290159.html