浮点数据与4个单字节的转换

前言:

在串口、IIC、SPI等数据传送时基本上都是一次传送一个字节的数据,如果要传送浮点数据?

通常是将浮点数乘以一个倍数,如10,100,1000,10000等,然后将其转换为整型数据再转化为单个字节进行传送。如果这个数据是要进行显示的话,那么这样做并没有什么不好。但是如果这个数是要传输给另端进行继续计算的话,那么就要考虑另一种方法了,就是直接将浮点数据转换为4个单字节,在另一端接受完数据后再转化为浮点数据,这种方式不会造成精度的丢失,计算量也比较小。

程序源码:

  1. #include <stdio.h>
  2. /*
  3. 要点提示:
  4. 1. float和unsigned long具有相同的数据结构长度
  5. 2. union据类型里的数据存放在相同的物理空间
  6. */
  7. typedef union
  8. {
  9. float fdata;
  10. unsigned long ldata;
  11. }FloatLongType;
  12. /*
  13. 将浮点数f转化为4个字节数据存放在byte[4]中
  14. */
  15. void Float_to_Byte(float f,unsigned char byte[])
  16. {
  17. FloatLongType fl;
  18. fl.fdata=f;
  19. byte[0]=(unsigned char)fl.ldata;
  20. byte[1]=(unsigned char)(fl.ldata>>8);
  21. byte[2]=(unsigned char)(fl.ldata>>16);
  22. byte[3]=(unsigned char)(fl.ldata>>24);
  23. }
  24. /*
  25. 将4个字节数据byte[4]转化为浮点数存放在*f中
  26. */
  27. void Byte_to_Float(float *f,unsigned char byte[])
  28. {
  29. FloatLongType fl;
  30. fl.ldata=0;
  31. fl.ldata=byte[3];
  32. fl.ldata=(fl.ldata<<8)|byte[2];
  33. fl.ldata=(fl.ldata<<8)|byte[1];
  34. fl.ldata=(fl.ldata<<8)|byte[0];
  35. *f=fl.fdata;
  36. }
  37. /*
  38. 测试函数
  39. */
  40. int main()
  41. {
  42. float f=123456.789f;
  43. unsigned char byte[4]={0};
  44. printf('float data=%f\n',f);
  45. Float_to_Byte(f,byte);
  46. f=789.123456f;
  47. printf('changed float data=%f\n',f);
  48. Byte_to_Float(&f,byte);
  49. printf('float data=%f\n',f);
  50. return 0;
  51. }

运行结果:

(0)

相关推荐