当前位置: 首页 > news >正文

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

http://www.jsqmd.com/news/335339/

相关文章:

  • Chandra多场景落地:教育、法务、IT、电商四大领域私有AI聊天实践
  • 告别PS抠图烦恼:AI净界RMBG-1.4实测效果惊艳,毛发细节完美保留
  • QQ音乐加密格式转换完全指南:告别播放限制,享受音乐自由
  • XNBCLI:高效处理XNB文件的资源定制工具指南
  • 使用微信小程序控制家用LED显示屏操作指南
  • 5步破解音乐播放故障:音乐引擎适配指南
  • ERNIE-4.5-0.3B-PT一键部署:vLLM+Chainlit开箱即用教程
  • HG-ha/MTools数据导出:结构化保存处理结果便于复用
  • 深入理解C++的转换运算符
  • RMBG-2.0AIGC工作流整合:Stable Diffusion提示词生成图→RMBG-2.0自动去背
  • 边缘AI推理节点C编译优化白皮书(附ARM Cortex-M7平台实测数据:启动时间↓58%,ROM占用↓61%)
  • 网页视频提取技术解析:猫抓Cat-Catch的底层原理与实战应用
  • MedGemma-X镜像运维:自动检测GPU温度超限并触发降频保护机制
  • StructBERT语义匹配系统可观测性:OpenTelemetry埋点与链路追踪
  • 开箱即用的Pi0具身智能:快速生成机器人控制轨迹
  • 【数据积木·数据体系篇】构建数据“双态”:在变化中锚定价值,于流动中实现复用
  • Pi0开源模型知识产权说明:Apache 2.0许可下商用注意事项
  • Z-Image-Turbo实战:用简单英文描述,轻松创作超写实艺术作品
  • 3个维度彻底改变MOBA游戏体验:智能辅助工具深度评测
  • 高速PCB设计中的差分等长玄机:Allegro约束管理器进阶技巧
  • 5步搞定AcousticSense AI:音乐流派识别快速上手
  • Meixiong Niannian实战:电商主图生成保姆级教程(含Prompt公式)
  • 如何突破网页资源获取限制?猫抓Cat-Catch让媒体下载效率提升300%
  • 创业者福音:低成本AI作图工具Z-Image-ComfyUI
  • 造相 Z-Image 效果震撼展示:768×768中国风水墨画高清细节特写
  • 如何优化Z-Image-Turbo性能?这些技巧你得知道
  • 医疗领域最强开源模型:Baichuan-M2-32B部署与体验报告
  • Clawdbot+Qwen3-32B私有部署:Web网关配置全流程解析
  • Qwen2.5-7B-Instruct商业应用:自动生成营销文案实战案例
  • 造相 Z-Image 开源模型部署教程:PyTorch 2.5.0 + CUDA 12.4环境验证