0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何把这4个字节的数据转换为float型呢?

GReq_mcu168 ? 来源:痞子衡嵌入式 ? 作者:痞子衡嵌入式 ? 2022-05-23 09:21 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

嵌入式系统的串口数据传输都是以字节为单位,但是有些特殊的数据类型,比如浮点型float a=231.5,在内存是如何表示的呢?

我们知道浮点型float数据类型占用4个字节,实际上在内存当中a=0x43678000,只是嵌入式芯片访问a时,知道a是浮点型数据,所以一次性读取4个字节,而且也按照浮点型的数据表示规定,将a转换为十进制的可读数据231.5。

如果我们从串口接收到4个字节数据{0x43,0x67,0x80,0x00},如何把这4个字节的数据转换为float型呢?

直接令float a=0x43678000这是不行的(不信的读者可以自行验证),这就是串口通讯当中经常遇到的问题,如果数据传输中包括了浮点型数据,在这里我们可以通过共用体或者结构体来解决。

对于共用体:

typedefunion
{
floatf;
unsignedchars[4];
}Union_test;

f的4个字节和s[4]的4个字节是共用一个区域,如果我们令f=231.5,然后通过VS的监视窗查看s[4]的数值,下面是测试程序:

#include
//共用体
//floatf;//4个字节
//chars[4];//4个字节
typedefunion
{
floatf;
unsignedchars[4];
}Union_test;
typedefstructst
{
floatf1;
}Struct_test;
voidmain(void)
{
floata=231.5;
Union_testx;
Struct_testz;
x.f=a;
z=*(Struct_test*)(&(x.s));
printf("z=%.2f
",(double)z.f1);
printf("Endofthisprogramme
");
}

监视结果如下所示:

9b3d481a-d8a3-11ec-ba43-dac502259ad0.jpg

我们同样适用结构体做了相同的实验,将数组s[4]={0x00,0x80,0x67,0x43}的首地址s[0]强制转换赋值给结构体z,最后打印输出的结果也是231.5

这里我们看到原本应该是0x4367_8000的数据实际存储的时候变成了00H 80H 67H 43H,这是因为计算机系统使用了小端存储,什么是小端存储呢?

我们都知道,对于一个超过一个字节的数据,其在计算机中的存储需要跨越字节。某些机器选择在存储器中按照从最低为有效字节到最高有效字节的顺序存储对象,而另一些机器则按照从最高为有效字节到到最低为有效字节的顺序存储,前一种存储方式被称为小端存储,后一种方式被称为大端存储。

举个例子,对于十六进制数0x01234567,其字节的存储顺序便依赖于机器,如下:

9b634038-d8a3-11ec-ba43-dac502259ad0.png我们可以通过下面的函数测试是大端存储还是小端存储:
voidtest(void)
{
inta=1;
unsignedchar*start=&a;
if(*start==1)
printf("小端存储");
elseif(*start==0)
printf("大端存储");
}

审核编辑 :李倩
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 串口
    +关注

    关注

    15

    文章

    1593

    浏览量

    80459
  • 字节
    +关注

    关注

    0

    文章

    42

    浏览量

    14192
  • 数据类型
    +关注

    关注

    0

    文章

    237

    浏览量

    13935

原文标题:串口传输数据时,结构体如何转换?

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    当从接收DMA一次接收一个字节时,如何检查是否已接收到任意长度的所有数据

    当从接收 DMA 一次接收一个字节时,如何检查是否已接收到任意长度的所有数据包?
    发表于 04-21 08:22

    设计了一基于浮点数运算的协处理器,使用C语言编程时没法输入float数据,请问有哪些部分需要修改?

    我设计了一基于浮点数运算的协处理器,使用C语言编程时没法输入float数据,请问有哪些部分需要修改?SDK,EXU_decoder浮点寄存器都需要修改吗,谢谢
    发表于 03-07 16:03

    将YOLOv4模型转换为IR的说明,无法将模型转换为TensorFlow2格式怎么解决?

    遵照 将 YOLOv4 模型转换为 IR 的 说明,但无法将模型转换为 TensorFlow2* 格式。 将 YOLOv4 darknet 转换为
    发表于 03-07 07:14

    用ADS1258的8AIN做单输入通道,转换完成以后用STM32单片机读取转换数据,这个转换的代码是怎么写的?

    请教一下用ADS1258的8AIN做单输入通道,转换完成以后用STM32单片机读取转换数据,这个转换的代码是怎么写的?ADS1258这个
    发表于 02-11 06:28

    华氏温度转换为摄氏温度并显示

    } // 发送一个字节数据通过串口 void send_byte(unsigned char byte) { SBUF = byte; while (!TI); TI = 0; } 上述
    发表于 01-31 10:15

    ads7043如何保证在接收第一个字节时adc的第九位不会输出?

    接收寄存器是8位 我在编程的时候遇到了问题 我想请问: 1. 如何保证在接收第一个字节时adc的第九位不会输出?是通过调低spi串口的波特率来保证单片机程序运行的时间吗? 2. 因为adc只输出14位数据
    发表于 01-13 08:23

    ADS1274用DRDY+TDM输出模式下,读到的第一个字节是无效的,为什么?

    今天调试中发现一问题,1274在用DRDY+TDM输出模式下,读到的第一个字节是无效的! 配置是4通道,在DRDY下降沿产生后,等待5us(采样率25K,即间隔40us)给出SPI的SCLK
    发表于 01-08 08:17

    请问一下ADS1293读取某一通道的高低2个字节的PACE数据,如何判断这是有效的PACE信号?

    请问一下ADS1293读取某一通道的高低2个字节的PACE数据,但是如何判断这是有效的PACE信号? 在处理的时候,根据是否是有效的PACE数据,才可以在ECG中设置起搏标志。
    发表于 01-06 07:43

    DSP28335浮点数据如何能对应到0X000~0XFFF之间

    ? 2.TLV5610的数据长度是16位,其中前4位为地址位。当我通过4位进入控制寄存器进行设置的时候,只需要继续写一设置命令就可以了吗
    发表于 12-26 06:03

    用ads1158在读取数据的时候,后面两个字节数据读不到,为什么?

    我现在用的ads1158在读取数据的时候,通道号是可以正常读取的,但是后面两个字节数据读不到,不管输入信号怎么变化,读到的两个字节数据始终是一
    发表于 12-24 06:16

    请问读出内部温度传感器的AD转换值,怎么转换为温度

    请问读出内部温度传感器的AD转换值,怎么转换为温度?手册上说参考NIST分度表,请问是哪一种分度表
    发表于 12-12 08:41

    ADS1299-4配置完成后DOUT输出还是216个字节吗?

    4通道1299芯片 其配置完成后DOUT输出还是216个字节吗?还是说变成了120个字节
    发表于 11-21 07:08

    请问TLV320AIC3106怎么转换32位float数据

    TLV320AIC3106怎么转换32位float数据
    发表于 11-05 08:07

    labview字符串如何转换为16进制字符串

    在LabVIEW中,将字符串转换为16进制字符串是一常见的需求,尤其是在处理数据通信和硬件接口时。LabVIEW提供了多种方法来实现这一转换,包括使用内置函数、编写VI(Virtua
    的头像 发表于 09-04 15:54 ?5731次阅读

    jk触发器转换为t的方法

    、复位、设置和反转。 将JK触发器转换为T触发器的基本步骤和原理如下: 步骤 连接J和K端口 : 将JK触发器的J端口和K端口连接在一起,并形成一单一的T端口。这一步是关键,因为T触发器的输入信号T直接决定了触发器的翻转,而在JK触发器中,J和
    的头像 发表于 08-28 09:38 ?3157次阅读