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("大端存储");
}

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

    关注

    14

    文章

    1483

    浏览量

    74508
  • 字节
    +关注

    关注

    0

    文章

    37

    浏览量

    13411
  • 数据类型
    +关注

    关注

    0

    文章

    227

    浏览量

    13496

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

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

收藏 人收藏

    评论

    相关推荐

    STM32G0B1RE 从SPI+DMA返回数据时开始3个字节错误的原因?怎么解决?

    的执行时间。通过MISO引脚可以看到前3个字节为0xF1,3个字节实际上为上一SPI通讯的末尾3字节,后面的"0x01 0x0
    发表于 04-07 06:20

    串口数据传输共用体与结构体之间的转换技巧

    如果我们从串口接收到4个字节数据{0x43,0x67,0x80,0x00},如何把这4个字节数据转换为float型呢?
    的头像 发表于 03-22 12:28 330次阅读
    串口<b class='flag-5'>数据</b>传输共用体与结构体之间的<b class='flag-5'>转换</b>技巧

    STM32G070挂载4设备,切换SPI极性和相位之后,第一个字节SCLK只有7,MOSI数据也不对是为什么?

    SCLK。一字节8,每个字节之间的空隙比正常的clk间隔大一些,所以第一个字节是少了一SCLK,而且MOSI上发送的
    发表于 03-15 07:17

    使用i2c从从站读取两个字节时,为什么主站只发送一个字节后就发送NACK

    I2C_RX_OVERFLOW,并陷入 while 循环直到超时。 但当我在 i2c 读取之前禁用中断时,问题就消失了。 那么,为什么主站只发送一个字节后就发送 NACK ?读取过程不能被中断打断吗?
    发表于 03-05 07:42

    用tc234l做QSPI实验,设置loopback模式,当发送超过3个字节时接收缓存前三个字节总是滞后一周期的原因?

    用tc234l 做QSPI实验,设置loopback模式,当发送超过3个字节时,接收缓存前三个字节总是滞后一周期(例如周期性发送四个字节数据,每次
    发表于 02-20 07:34

    51单片机如何连续接受多个字节数据

    51单片机如何连续接受多个字节数据?有一串4个字节数据需要从电脑连续传给单片机。
    发表于 11-08 07:04

    stm32如何向串口用一个字节发送3300这个数?

    交换。在STM32中,通过使用UART模块实现串口通信。在使用串口通信时,需要将数据转换为二进制格式,并逐个字节进行传输。本文将详细介绍如何向串口发送3300这个数值。 一、串口通信原理 串口通信是一种基于串行传输的通信方式。在
    的头像 发表于 10-26 11:31 484次阅读

    单片机串口怎么接收24个字节数据并读取出来?

    单片机串口怎么接收24个字节数据,并读取出来
    发表于 10-23 07:30

    为何FPU使用float变量地址要4字节对齐

    为何 FPU 使用 float 变量地址要 4 字节对齐?
    发表于 10-20 06:53

    MINI51内部FMC做EEPROM功能,读出来的4字节全是0如何解决?

    1,2,3,4),然后在马上读出来4个字节数据来(读出来的4
    发表于 08-25 07:59

    M0518用串口接收数据时,第一个字节是正常的,为什么后面的第二、三字节却是乱的?

    M0518用串口接收数据时出问题。发送端共发送3个字节,固定第一字节数据会改变,其它两个字节数据一直为0,可是接收端收到的
    发表于 08-21 07:13

    UART发送数据丢失最后一个字节

    电子发烧友网站提供《UART发送数据丢失最后一个字节.pdf》资料免费下载
    发表于 08-01 17:57 1次下载
    UART发送<b class='flag-5'>数据</b>丢失最后一<b class='flag-5'>个字节</b>

    Python字符与字节

    的不同的表示方法就是指字符编码,比如字母A-Z都可以用ASCII码表示(占用一个字节),也可以用UNICODE表示(占两个字节),还可以用UTF-8表示(占用一个字节)。字符编码的作用就是将人类可识别的字符
    的头像 发表于 07-05 15:55 670次阅读

    如何float类型的变量发送到串口调试助手?

    ,你可以去百度,不过你看了也会头大,不一定能看懂。看懂看不懂,都不重要了。 那么,比如,3.141这个数在单片机中存储的4个字节分别是多少? 你可以借助一软件(浮点数十六进制
    发表于 06-15 07:24

    Labview怎么串口接收到的数据转换成浮点数?

    我想把串口发送过来的信号转成浮点数。他的数据包开头是“55AA”,然后四个字节代表一个数据,低字节在前,如33 83 3B 46,表示12000.8。 我用的labview编写的上位
    发表于 05-15 19:09