找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

264

积分

0

好友

20

主题
发表于 昨天 01:20 | 查看: 6| 回复: 0

在嵌入式数据通信中,浮点数据的传输是一个常见需求。本文将详细介绍两种实现浮点数据传输的方法,并分析其优劣。

假设有两个设备A和B,通过串口进行通信。设备A需要将一个双精度浮点数 double love = 520.1314 发送给设备B。由于串口按字节传输数据,因此需要将double类型转换为字节序列。

方法一:转换为整数传输

这种方法的核心思路是避免直接处理浮点数。

  1. 转换:在发送端A,将浮点数乘以一个固定倍数(例如love * 10000),转换为一个整数。
  2. 传输:将此整数作为8字节数据通过串口发送。
  3. 还原:在接收端B,收到数据后,将其除以相同的倍数(10000),即可还原出原始浮点值。

这种方式可以实现数据的准确传输。

方法二:通过指针直接转换

此方法利用指针直接操作内存中的原始数据,是系统编程中提升效率的常用技巧。

  1. 获取原始字节:在发送端A,使用指针或memcpy获取浮点数变量在内存中的原始字节序列。
    double love = 520.1314;
    unsigned char data[8] = { 0 };
    memcpy(data, &love, 8);
  2. 传输:将data数组中的8个字节通过串口发送。
  3. 还原:在接收端B,将接收到的字节数组强制转换为double类型指针,即可访问原始浮点值。
    double* pLove = (double*)recv_data;
    // 使用 *pLove 获取值

浮点数的存储格式

如果将 double love = 520.1314 的十六进制数据打印出来,可能会得到类似 0x8e 0x75 0x71 0x1b 0x0d 0x41 0x80 0x40 的序列。这些字节看起来与520.1314毫无关系,因为它们遵循IEEE 754浮点数标准,使用科学计数法进行存储。具体规范可另行查阅。

总结与对比

以上两种方法均能完成任务,但从嵌入式开发的角度看,差异显著:

  • 方法一(整数转换)

    • 缺点:需要进行乘除运算,在资源受限的嵌入式环境中可能带来额外的计算开销。
    • 缺点:如果浮点数的小数位数不固定,还需额外约定或传输缩放因子,降低了通信效率。
  • 方法二(指针转换)

    • 优点:仅需知晓数据类型即可,无需计算,直接传输内存映像,简单高效。
    • 优点:避免了中间转换和可能的数据精度问题。

指针的本质是获取数据在内存中的地址,所指向的内存块存储着最原始的数据。不同类型的变量只是对这些原始数据的不同解释。掌握指针,意味着能更直接、高效地操作数据,减少不必要的中间转换和内存分配,这对于理解复杂的数据结构及其操作至关重要。

然而,指针带来的风险在于内存越界。如果使用不当,会导致数据损坏或程序崩溃,且此类问题难以排查。因此,在使用指针时,必须严格进行内存边界保护,养成良好的编程习惯,以增强代码的健壮性。




上一篇:UART、I2C、SPI、RS485、CAN通信协议全面对比与实战应用指南
下一篇:操作系统核心作用解析:资源分配、隔离与抽象的价值
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-8 20:33 , Processed in 0.084350 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表