news 2026/4/18 10:31:09

C语言——关于float型转为4个字节的格式(利用共用体)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言——关于float型转为4个字节的格式(利用共用体)

在单片机对外发送的时候我们经常需要将字节拼起来,但是有的数据是浮点型或者double类型,要将其转换为字节形式,方便数据进行校验值计算等操作。

#include "stdio.h"

union
{
float f;
uint8_t u[4];
}trans;

uint8_t datavalue[4];

//浮点转换
trans.f=angvel;
for(int i=0;i<4;i=0)
{
datavalue[i]=trans.u[i];
}

Uart4_Send(datavalue,4);

AI写代码
c
运行

————————————————
版权声明:本文为CSDN博主「老王WHH」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/whhcsdn233/article/details/144978895

嵌入式系统中通过共用体实现串口浮点型数据转换

01嵌入式系统串口数据传输

嵌入式系统的串口数据传输通常以字节为单位进行。然而,当传输某些特殊数据类型,例如浮点型数据时,其内存表示方式就变得复杂。浮点型数据,如float a=231.5,在内存中实际上是以特定的二进制形式存储的。在嵌入式系统中,当芯片访问这样的浮点型数据时,它会一次性读取4个字节,并按照浮点型数据的表示规定进行转换,从而得到我们熟悉的十进制可读数据。

但当我们从串口接收到4个字节的数据,例如{0x43, 0x67, 0x80, 0x00},如何将这些字节数据转换为float型呢?直接将这4个字节赋给一个float变量是不行的,这就是串口通讯中经常遇到的问题。为了解决这个问题,我们可以使用共用体结构体来处理这种特殊的数据转换。

► 浮点型数据的问题

嵌入式系统中,浮点型数据以特定二进制形式存储,直接从串口接收的字节数组不能直接赋给float变量。当我们从串口接收到4个字节的数据时,例如{0x43, 0x67, 0x80, 0x00},我们需要一种方法来将这些字节数据转换为float型。

通过观察和测试,我们可以定义一个包含float类型和unsigned char数组的共用体,通过这样的共用体,可以方便地将串口接收到的4个字节数据转换为float型。

► 使用共用体的方法

对于共用体方法,我们可以这样定义:

```c

typedef union {

float f;
unsigned char s[4];

} FloatUnion;

```

这里,我们定义了一个包含float类型和unsigned char数组的共用体。通过这个共用体,我们可以方便地将串口接收到的4个字节数据转换为float型。

在这个共用体定义中,float类型的f和unsigned char数组s[4]是共享同一块内存区域的。当我们给f赋值为231.5时,可以通过观察s[4]的数值来验证这一点。为了更好地理解这个过程,我们可以编写一个简单的测试程序,利用VS的监视窗来查看s[4]的值。以下是一个可能的测试程序示例:

```c

// 共用体定义

typedef union {

float f;
unsigned char s[4];

} Union_test;

int main() {

Union\_test test;
test.f = 231.5; // 给float类型的成员赋值
// 在此处,我们可以利用调试工具(如VS的监视窗)来查看s[4]的值,以验证内存共享的效果。
return 0;

}

```

通过这个测试程序,我们可以清晰地看到,float类型的f和unsigned char数组s[4]确实是共享同一块内存区域的。当我们给f赋一个值时,这个值会直接反映在s[4]上,反之亦然。这种特性使得我们能够灵活地处理串口接收到的字节数据,将其转换为float型或其他数据类型。

► 小端存储的影响

同样地,我们进行了结构体实验,将数组s[4]={0x00,0x80,0x67,0x43}的首地址s[0]强制转换为结构体z的地址并赋值,最终打印结果仍为231.5。这表明,原本应存储为0x4367_8000的数据在实际存储时变为了00H 80H 67H 43H。

这背后的原因是计算机系统采用了小端存储方式。那么,什么是小端存储呢?简单来说,当数据超过一个字节时,其存储需要跨越多个字节。不同的机器在存储时会有不同的顺序选择。有些机器会从最低有效字节开始存储,逐渐向最高有效字节过渡,这种方式被称为小端存储;而另一些机器则相反,从最高有效字节开始,逐渐降低至最低有效字节,这种方式被称为大端存储。

以十六进制数0x01234567为例,其字节的存储顺序便取决于所使用的机器。

https://baijiahao.baidu.com/s?id=1846464818222825175&wfr=spider&for=pc

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 5:34:56

使用微信小程序控制家用LED显示屏操作指南

以下是对您提供的博文内容进行 深度润色与工程化重构后的版本 。我以一位深耕嵌入式+IoT+微信生态多年的一线开发者视角,摒弃模板化表达、去除AI腔调,用真实项目中的思考逻辑、踩坑经验与技术权衡来重写全文。语言更紧凑、节奏更自然、信息密度更高,同时强化了“为什么这么…

作者头像 李华
网站建设 2026/4/17 12:55:51

C++中的概念与复合要求

引言 在C编程中&#xff0c;概念&#xff08;Concepts&#xff09;是一个强大的工具&#xff0c;用于定义模板的约束条件和类型要求。今天我们将深入探讨C中的一个相对较新的语法特征——复合要求&#xff08;Compound Requirements&#xff09;。这种语法虽然看起来有些陌生&…

作者头像 李华
网站建设 2026/4/18 7:57:41

Z-Image-Turbo更新方法:如何获取最新版本功能

Z-Image-Turbo更新方法&#xff1a;如何获取最新版本功能 1. 为什么需要定期更新Z-Image-Turbo&#xff1f; Z-Image-Turbo不是一成不变的静态工具&#xff0c;而是一个持续进化的AI图像生成系统。科哥团队基于阿里通义Z-Image-Turbo模型进行的二次开发&#xff0c;始终在快速…

作者头像 李华
网站建设 2026/4/18 0:33:45

MedGemma-X在医疗影像中的3大应用场景解析

MedGemma-X在医疗影像中的3大应用场景解析 1. 场景一&#xff1a;放射科医生的智能阅片助手——从“看图说话”到“对话式诊断” 传统放射科工作流中&#xff0c;医生需要在数分钟内完成一张X光片的观察、分析、描述和报告撰写。这个过程高度依赖经验积累&#xff0c;新手医生…

作者头像 李华
网站建设 2026/4/2 13:54:31

RePKG:Wallpaper Engine资源处理工具效率提升指南

RePKG&#xff1a;Wallpaper Engine资源处理工具效率提升指南 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 如何用RePKG解决壁纸资源提取的三大核心痛点&#xff1f; 痛点一&…

作者头像 李华
网站建设 2026/4/18 10:07:27

用CAM++做了个声纹比对项目,附完整操作流程

用CAM做了个声纹比对项目&#xff0c;附完整操作流程 声纹识别不是科幻电影里的专属技术了。最近我用一个叫CAM的开源系统&#xff0c;搭了个能真正判断“是不是同一个人在说话”的声纹比对工具——没有写一行训练代码&#xff0c;没配环境变量&#xff0c;从下载镜像到跑通验…

作者头像 李华