news 2026/4/16 15:02:40

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/16 12:58:10

深入理解C++的转换运算符

在C++编程中,类型转换是一个常见的操作,C++提供了多种方式来实现类型转换。今天我们将讨论一种特殊的类型转换方法——转换运算符(Conversion Operator)。通过学习这个特性,我们可以更好地理解C++的类型系统以及如何有效地使用它。 什么是转换运算符? 转换运算符是一个…

作者头像 李华
网站建设 2026/4/16 10:59:31

3个被忽视的效率杀手:这款工具如何让资源处理时间缩短80%?

3个被忽视的效率杀手&#xff1a;这款工具如何让资源处理时间缩短80%&#xff1f; 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 为什么专业开发者都在用这款小众工具&#xff1f;…

作者头像 李华
网站建设 2026/4/16 11:10:23

5步打造全自动游戏体验:LeagueAkari玩家效率提升指南

5步打造全自动游戏体验&#xff1a;LeagueAkari玩家效率提升指南 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 还在为英雄…

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

[特殊字符] GLM-4V-9B完整指南:支持图片上传的本地大模型部署

&#x1f985; GLM-4V-9B完整指南&#xff1a;支持图片上传的本地大模型部署 你是否试过想在自己电脑上跑一个真正能“看图说话”的大模型&#xff0c;却卡在环境报错、显存不够、图片传不上去、回答乱码这些坑里&#xff1f;别折腾了——这次我们把 GLM-4V-9B 真正跑通了&…

作者头像 李华