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

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

3天内不再提示

串口传输数据时,结构体如何转换?

Q4MP_gh_c472c21 来源:嵌入式专栏 作者:嵌入式专栏 2022-04-08 09:36 次阅读

嵌入式系统的串口数据传输都是以字节为单位,但是有些特殊的数据类型,比如浮点型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
");
}

监视结果如下所示:

8a680a3a-b6ba-11ec-aa7f-dac502259ad0.jpg

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

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

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

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

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

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

    关注

    4

    文章

    230

    浏览量

    27653
  • 串口
    +关注

    关注

    14

    文章

    1540

    浏览量

    76015
  • 传输数据
    +关注

    关注

    1

    文章

    110

    浏览量

    16080

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

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于51单片机的温湿度检测报警及串口传输系统

    温湿度报警阈值,且测得的温湿度超过设定的阈值时,相应报警指示灯闪烁,蜂鸣器报警; (3)可将测得的温湿度值实时发送到串口显示。仿真演示视频:基于51单片机的温湿度检测报警及串口传输系统-仿真
    的头像 发表于 10-22 14:12 115次阅读
    基于51单片机的温湿度检测报警及<b class='flag-5'>串口传输</b>系统

    sdi接口传输什么信号

    通过嵌入方式实现同步传输)进行采样、量化、编码等处理,然后转化为串行数据流进行传输。在传输过程中,SDI接口采用了差分信号传输和时钟恢复技术
    的头像 发表于 08-20 15:03 836次阅读

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

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

    什么是串口 串口传输和adc的关系及区别

    串口通信中,数据以位的形式逐个传输,一般采用异步通信方式,即不需要时钟信号来同步数据传输。在每个字符的开头和结尾会有起始位和停止位,用于标识数据
    的头像 发表于 03-12 17:32 1528次阅读

    什么是串口 串口无法传输数据的原因

      串口的出现可以追溯到1980年前后,当时的数据传输率大约在115kbps至230kbps之间。初期,串口主要用于连接计算机的外设,如鼠标、外置Modem、老式摄像头和写字板等设备。
    的头像 发表于 03-01 16:28 9229次阅读
    什么是<b class='flag-5'>串口</b> <b class='flag-5'>串口</b>无法<b class='flag-5'>传输</b><b class='flag-5'>数据</b>的原因

    编解码一机在流媒体传输中的核心作用

    编解码一机在流媒体传输中起着核心作用,主要表现在以下几个方面: 1. 视频和音频编码:编解码一机能够对视频和音频数据进行高效的编码,将原始的多媒体
    的头像 发表于 01-31 14:20 386次阅读
    编解码一<b class='flag-5'>体</b>机在流媒体<b class='flag-5'>传输</b>中的核心作用

    求助,请问一个结构如何全部定义到 __attribute__ 区域?

    请问一个结构如何全部定义到 __attribute__ 区域? 例如我这里涉及到一些高速计算的缓存,计划将缓存数据存储到 __attribute__ 区域。 三个结构
    发表于 01-16 07:29

    结构与指针的关系

    在C语言中,结构(Struct)是一种用户自定义的数据类型,它允许您将不同类型的数据项组合在一起,以便形成一个更复杂的数据结构
    的头像 发表于 01-11 08:00 905次阅读
    <b class='flag-5'>结构</b><b class='flag-5'>体</b>与指针的关系

    TS201 link口传输数据不通,用示波器观察LACKO信号一直为低电平是为什么?

    TS201 link口传输数据,一个link口为发送,一个link口为接收,link口和相关DMA配置和初始化完成后,在主函数当中收发一直运行,目前只发送4个unsigned int型数据,link口的
    发表于 01-11 07:13

    stm32虚拟串口接收的数据处理

    ,我们需要了解虚拟串口的工作原理。虚拟串口是通过软件模拟的串口数据通过USB端口传输。在STM32中,我们可以使用USB CDC(Comm
    的头像 发表于 12-20 11:22 2117次阅读

    智能车ROS与STM32串口通信代码

    Stm32_Serial; // 声明串口对象 并且在类的定义中,声明两个结构,用来存储接收和要发送的数据 RECEIVE_DATA Receive_Data ; //The se
    的头像 发表于 11-26 17:47 1097次阅读

    安全存储功能中使用的重要结构

    安全存储功能中使用的重要结构 在整个安全存储功能的操作过程中,存在一些很重要的结构,这些结构体用于记录或保存所有安全文件和dirf.db
    的头像 发表于 11-21 14:36 458次阅读
    安全存储功能中使用的重要<b class='flag-5'>结构</b><b class='flag-5'>体</b>

    ROS与STM32串口通信代码

    Stm32_Serial; // 声明串口对象 并且在类的定义中,声明两个结构,用来存储接收和要发送的数据 RECEIVE_DATA Receive_Data ; //The se
    的头像 发表于 11-17 18:10 1017次阅读

    串口传输协议

    通信传输协议
    油泼辣子
    发布于 :2023年11月16日 17:18:55

    bmp图片通过串口传送spi flash需要变化图片格式吗?

    请教一下,如果想把bmp图片通过串口传送到spi flash,需要把bmp转换成什么格式?
    发表于 11-07 07:46