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

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

3天内不再提示

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

strongerHuang 来源:博客园 2024-03-22 12:28 次阅读

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

监视结果如下所示:

9d798758-e7ea-11ee-a297-92fbcf53809c.jpg

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

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

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

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

9d8c54d2-e7ea-11ee-a297-92fbcf53809c.png

我们可以通过下面的函数测试是大端存储还是小端存储:

voidtest(void) { inta=1; unsignedchar*start=&a; if(*start==1) printf("小端存储"); elseif(*start==0) printf("大端存储"); }

审核编辑:黄飞

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

    关注

    41

    文章

    3563

    浏览量

    129204
  • 数据传输
    +关注

    关注

    9

    文章

    1827

    浏览量

    64465
  • 内存
    +关注

    关注

    8

    文章

    2996

    浏览量

    73870
  • 串口
    +关注

    关注

    14

    文章

    1543

    浏览量

    76162

原文标题:串口数据传输当中的共用体和结构体转换

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言-枚举、共用

    前面章节学习了结构结构里可以按顺序存放相同或者不同的数据类型,每个成员都有它对应的存储空间。 而
    的头像 发表于 09-09 11:31 944次阅读

    socket 传输结构 省去字符与数据转换

    socket通讯中send函数直接传送的是字符串为了避免客户端和服务器断的数据格式转换,使用结构传输较为合适---------------
    发表于 09-25 16:58

    结构-共用和用户定义类型

    结构-共用和用户定义类型
    发表于 01-31 10:48

    模拟数字转换数据传输

    的稳定性,令数据传输出现误码。克服这些问题的其中一个办法是采用低电压差分信号 (LVDS) 数据总线。图 1 是其中一种模拟/数字转换器的结构框图,带有LVDS 输出信号,驱动专用集成
    发表于 07-12 06:18

    串口传输结构是什么意思

    串口传输 结构就是 把结构 转换为 数组 ,然后传输
    发表于 07-14 08:34

    结构共用的区别

    语言中,还有另外一种和结构非常类似的语法,叫做共用(Union),它的定义格式为:union 共用
    发表于 07-20 06:57

    C语言的结构共用在单片机中的妙用是什么

    【分享】C语言的结构共用在单片机中的妙用C语言的结构
    发表于 11-30 06:13

    怎样去使用C语言的结构共用

    C语言的结构共用分别有何特点呢?怎样去使用C语言的结构
    发表于 01-17 07:51

    stm32数据传输的相关资料分享

    简介DMA,全称Direct Memory Access,即直接存储器访问。DMA传输数据从一个地址空间复制到另一个地址空间,提供在外设和存储器之间或者存储器和存储器之间的高速
    发表于 02-22 06:58

    数据传输速率是什么意思

    数据传输速率是什么意思 数据传输速率是通过信道每秒可传输的数字信息量的量度。数据传输速率也称为吞吐率。数据传输速率由很
    发表于 03-18 14:45 4985次阅读

    LabVIEW的串口转WiFi数据传输实现方法

    在测控领域,仪器与计算机之间通常采用串口通信,串口通信是有线传输,存在传输距离短、可移动性差等缺点。本文采用
    发表于 11-17 11:20 4224次阅读

    共用结构的区别

    在c++中,结构(struct)和共用(union)是两种很相似的复合数据类型,都可以用来存储多种
    发表于 11-19 17:46 3.7w次阅读

    C语言程序设计教程之结构共用的详细资料说明

    本文档详细介绍的是C语言程序设计教程之结构共用的详细资料说明主要内容包括了:1 结构,2
    发表于 03-01 17:20 11次下载
    C语言程序设计教程之<b class='flag-5'>结构</b><b class='flag-5'>体</b>与<b class='flag-5'>共用</b><b class='flag-5'>体</b>的详细资料说明

    串口数据传输中的共用结构如何转换

    我们知道,浮点型float数据类型占用4个字节,实际上在内存当中a = 0x43678000,只是嵌入式芯片访问a时,知道a是浮点型数据,所以一次性读取4个字节,而且也按照浮点型的数据表示规定,将a
    的头像 发表于 03-14 16:53 426次阅读

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

    嵌入式系统的串口数据传输都是以字节为单位,但是有些特殊的数据类型,比如浮点型float a=231.5,在内存是如何表示的呢?
    的头像 发表于 05-19 10:52 718次阅读
    <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>?