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

    文章

    1627

    浏览量

    83352
  • 字节
    +关注

    关注

    0

    文章

    44

    浏览量

    14404
  • 数据类型
    +关注

    关注

    0

    文章

    238

    浏览量

    14233

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

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

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    MIMXRT1189奇数长度UDP数据包的最后一个字节出现问题,为什么?如何解决?

    我遇到了一问题,即奇数长度 UDP 数据包的最后一个字节无法通过线路正确发送。最后一个字节似乎是未初始化或过时的数据。如果我将 UDP
    发表于 04-17 07:47

    嵌入式中的浮点数据转换为字节类型的三种方法

    一般是以字节的形式进行数据交互。要想传输一浮点数需要把浮点数转换为字节的形式。 MCU不能直接保存浮点
    发表于 01-07 06:28

    为什么会有小端字节

    字节序,比如网络传输和文件储存。 计算机处理字节序的时候,不知道什么是高位字节,什么是低位字节。它只知道按顺序读取字节,先读第一
    发表于 12-15 06:24

    请问CW32W031每次传输建议发送最大多少个字节

    我看介绍,CW32W031(Sub-1G)空旷区域通信距离可以达到5km,主要实现小数据量、低功耗、复杂环境长距离通信。相比于NBIoT技术,Sub-1G节省了资讯费 那么,如果想使用CW32W031,建议每次传输发送最大多少个字节比较好?或者这种是需要怎么来测试?是有什
    发表于 12-10 07:09

    C语言自动类型转换

    一、自动类型转换 数据类型存在自动转换的情况. 自动转换发生在不同数据类型运算时,在编译的时候自动完成。 char类型
    发表于 11-25 08:04

    对UART0输入到串口的char数据转换成16进制的寄存器常用int相关处理

    根据ascii码的对照,将char转换成int数据。 然后我们又遇到问题,若是想将uart0接受到的8
    发表于 10-31 07:58

    使用ftp下载固件,每次都会或多或少接收错几个字节,怎么改善?

    使用EC600的4G模组,在进行远程FTP下载固件升级时,每次都会或多或少接收错几个字节,偶尔才出现一次接收完全正确的固件,所以导致重启后qboot校验固件CRC不过,升级失败现象,这种现象一般应该如何查询?准备调整
    发表于 09-18 07:23

    如何通过VCOM将4CAN FD消息转换为SLCAN?

    通过VCOM接口将M460系列微控制器(MCU)的4条CAN FD消息转换为SLCAN协议,并发送到计算机。
    发表于 08-19 06:23

    TC334 uart dma发送数据时,只能发送17个字节,怎么解决?

    具体情况:配置串口发送,具体配置情况如下,对于17字节内的数据包能够正常发送,大于17字节数据包只能发送前17字节。(已做好
    发表于 08-04 07:18

    如何使用20829 can-fd发送64字节扩展标识符数据帧?

    numberOfFIFOElements更改为16。 使用两20829 EVK进行测试,最大传输数据大小为15个字节。DLC范围是0~15 uint32数据,但实际上,另一
    发表于 08-04 06:56

    USB3014遇到写入字节限制,当写入数据的长度为1024字节或其整数倍时,无法完成写入操作怎么解决?

    ,USB3014 会自动将数据写入 FIFO 并将完整数据包发送至 USB 主机。若要发送的数据不足满包,则需在写入最后一个字节时断言 PKTEND# 信号,以便告知 USB3014
    发表于 07-28 08:28

    STM32407使用串口闲时中断+DMA方式接收最大接收字节是多少?

    使用串口闲时中断+DMA方式接收数据,波特率为460800,DMA接收长度为1024个字节,并开启串口闲时中断,当上位机一次发送520个字节,我发现串口产生了两次中断,第一次接收的最大字节
    发表于 07-22 08:16

    2.0.0版本的ST Edge AI Core在linux平台上可以量化后的onnx模型转换为.nb,但是运行报错,缺少文件,为什么?

    2.0.0版本的ST Edge AI Core工具在linux平台上应该是可以量化后的onnx模型转换为.nb,但是运行报错,缺少文件。
    发表于 06-17 06:29

    USB芯片CY7C68013A和FPGA进行通信,从EP6读取512字节是正常的,但是读取2个字节失败,为什么?

    大家好,USB芯片CY7C68013A和FPGA进行通信,从EP6读取512字节是正常的,但是读取2个字节失败(fpga端一直在发)Bulk IN failed,谢谢
    发表于 05-30 07:12

    使用FX3测试程序中的数据流时,遇到了每8个字节重复的场景,是什么原因导致的?

    我在使用 FX3 测试程序中的数据流时,遇到了每 8 个字节重复的场景。
    发表于 05-21 06:59