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

    文章

    1551

    浏览量

    76447
  • 字节
    +关注

    关注

    0

    文章

    40

    浏览量

    13727
  • 数据类型
    +关注

    关注

    0

    文章

    236

    浏览量

    13618

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

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

收藏 人收藏

    评论

    相关推荐

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

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

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

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

    MAX9877将数据发送到NVM中,发送数据时,必须要填满128个字节吗?

    想请问一下9877将数据发送到NVM中,一页的数据传输,最多可以发送128字节。想问一下发送数据时,必须要填满128个字节吗,还是可以只要发
    发表于 07-24 07:00

    使用ESP32的NVS-BLOB存储12000个字节数据报错的原因?

    使用ESP32的NVS-BLOB存储12000个字节数据,每次完全擦除flash后编程写第一次都没问题,但之后再写就报错误ESP_ERR_NVS_NOT_ENOUGH_SPACE (0x1105
    发表于 06-21 06:53

    ESP32 BLE使用nimble协议栈怎样才能发送超过20个字节数据

    我在使用蓝牙传送传感器数据,目前只能发送20个字节大小的数据包,请问大家是如何实现发送大于20字节数据包的。我想尝试将
    发表于 06-17 07:18

    请问ESP32C3串口收数据多于120个字节如何处理?

    请教一问题,我现在用ESP32C3收数据,串口最大接收120字节就进入事件了,请问ESP32C3串口收数据多于120个字节如何处理。 例如
    发表于 06-06 08:02

    修改USB_HID的报告ID,receive_buffer会改变前4个字节,为什么?

    修改USB_HID的报告ID,receive_buffer会改变前4个字节
    发表于 05-06 06:36

    STM32 USB CDC为什么只能发送4096个字节

    ( USBD_Device, (uint8_t *)Imgbuf, 59904); USBD_CDC_TransmitPacket( USBD_Device); 发送数据,结果每次发送到4096个字节后死掉
    发表于 04-29 07:49

    stm32读sd卡单个数据块最后80个字节全是0,怎么crc还校验正确?

    stm32 读sd卡单个数据块最后80个字节全是0,怎么crc还校验正确。PS. 用的是SDIO口,4bit总线,1M的SDIO_CK.
    发表于 04-25 07:19

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

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

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

    如果我们从串口接收到4个字节数据{0x43,0x67,0x80,0x00},如何4个字节
    的头像 发表于 03-22 12:28 721次阅读
    串口<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

    spi读取多个字节的时候该怎么判断UART的上一个字节已经读完了?

    想问一下 spi 的 SPI_SpiIsBusBusy() 的这个API在 UART 中怎么实现,读取多个字节的时候该怎么判断 UART 的上一个字节已经读完了?
    发表于 02-02 06:54