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

    文章

    225

    浏览量

    27534
  • 串口
    +关注

    关注

    14

    文章

    1500

    浏览量

    74648
  • 传输数据
    +关注

    关注

    1

    文章

    97

    浏览量

    16015

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

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

收藏 人收藏

    评论

    相关推荐

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

    如果我们从串口接收到4个字节数据{0x43,0x67,0x80,0x00},如何把这4个字节的数据转换为float型呢?
    的头像 发表于 03-22 12:28 381次阅读
    <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 1174次阅读

    串口传输协议

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

    怎么验证串口传输数据有误然后重发?

    怎么验证串口传输数据有误 然后重发?
    发表于 10-24 08:21

    使用串口传输助手输出乱码怎么解决?

    [i][i] 我编写了一个简单的串口传输函数,但是串口传输助手显示乱码 int i; for(i=0;i<200;i++) { data[i]=i+1; comSendBuf
    发表于 10-18 06:14

    FT232在串口传输的时候最大速度能达到多少?

    FT232在串口传输的时候最大速度能达到多少
    发表于 10-12 07:25

    modbus的串口传输为什么需要设置一样的通信配置?

    modbus的串口传输为什么需要设置一样的通信配置
    发表于 10-09 06:38

    串口传输速率低于波特率怎么办 串口通信的波特率如何设置

    如果串口传输速率低于波特率,您可以尝试以下方法来解决问题:   1. 检查硬件连接:确保串口连接正确且牢固。检查连接线是否完好,确保没有松动或断开的接触。   2. 检查波特率设置:确保发送端和接收端的波特率设置一致。请在串口
    的头像 发表于 09-08 16:23 4175次阅读

    串口传输的是什么信号 串口接收到的数据怎么解读出来

     串口通信采用的是串行传输方式,即逐位地传输数据数据按照特定的格式和规则被分为连续的位序列,并通过TX线
    的头像 发表于 09-04 16:17 6171次阅读

    串口传输速率低于波特率会怎么样 串口传输速率低于波特率的原因

    低于波特率的传输速率可能导致数据传输错误。由于数据传输过程中受到时钟同步和波特率控制的影响,如果传输速率低于预期的波特率,可能会导致
    的头像 发表于 08-25 15:24 1838次阅读

     什么叫传输速率 串口传输速率范围是多少

    对于数字数据传输传输速率表示每秒钟传输的比特数或字节数。例如,一个传输速率为1 Mbps的网络连接,表示每秒钟可以传输100万个比特(或1
    的头像 发表于 08-24 15:21 7661次阅读

    怎么通过串口传输文件 网口传输串口传输的区别

    串口通常用于串行数据传输,主要用于传输数字数据。在传统的串口通信规范(如RS-232、RS-485)中,并没有专门设计用于
    的头像 发表于 08-18 15:15 7683次阅读

    串口通信协议有哪些 串口传输文件方法有哪些类型

    串口传输文件的方法有以下几种类型:   1. XMODEM:XMODEM是一种最早应用于串口传输文件的协议,它使用简单的数据结构进行传输
    的头像 发表于 08-15 14:43 1.1w次阅读

    串口的收发是指什么 串口传输与蜂鸣器的关系是什么

    串口是一种通信接口,用于在计算机和外部设备之间传输数据串口传输通常使用一根传输线,按照一定的协议和通信速率,将
    发表于 08-10 14:59 954次阅读

    串口传输距离多远最好 串口与并口有何区别

    串口传输通常是双向传输的。串口通信使用的是一对发送和接收线路,允许数据的双向传输。发送线路将数据
    发表于 08-07 16:54 1024次阅读