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

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

3天内不再提示

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

Dp1040 来源:工程师进阶笔记 2023-05-19 10:52 次阅读

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

监视结果如下所示:

ceb0cf7c-f5ef-11ed-90ce-dac502259ad0.jpg

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

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

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

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

cebc6936-f5ef-11ed-90ce-dac502259ad0.png  

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

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

审核编辑:汤梓红

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

    关注

    5068

    文章

    19014

    浏览量

    303210
  • 嵌入式系统
    +关注

    关注

    41

    文章

    3564

    浏览量

    129223
  • 内存
    +关注

    关注

    8

    文章

    2998

    浏览量

    73881
  • 串口
    +关注

    关注

    14

    文章

    1543

    浏览量

    76182
  • 结构体
    +关注

    关注

    1

    文章

    129

    浏览量

    10833

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

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

收藏 人收藏

    评论

    相关推荐

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

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

    串口传输结构是什么意思

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

    单片机C语言串口传输结构是什么?

    单片机C语言串口传输结构是什么?
    发表于 10-14 06:44

    如何通过串口传输数据

    目录一、串口通信概述1. 串口如何连接2. 如何计算波特率二、实验演示1. 实验设备2. 实际电路连接3. 通过串口传输数据三、总结参考文献一、串口
    发表于 01-12 06:03

    如何用串口传输float类型数据

    单片机小知识如何使用串口传输float类型数据比较难的就是数据进制的转化模拟量比如说 角度 距离速度 这些是10进制,串口通信用的是16进制 ,
    发表于 01-19 06:12

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

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

    串口通讯服务器的端口传输速率

    串口通讯服务器的端口传输速率  由于终端服务器产品通常具有多种接口,每种接口传输速率各不相同。典型接口传输速率如下:
    发表于 01-07 14:00 1670次阅读

    通过DMA模式控制串口传输的方法

    在USART文章中讲解了串口的轮询和中断模式,本文介绍一下通过DMA模式控制串口传输
    的头像 发表于 09-23 11:08 1.1w次阅读
    通过DMA模式控制<b class='flag-5'>串口传输</b>的方法

    STM32 LoRa无线数传模块 PC通过串口传输数据到单片机

    STM32F1单片机,烧录代码后,连接LoRa无线数传模块,在PC上面使用串口助手,通过串口传输数据到单片机串口1,并在LCD显示屏显示
    发表于 11-19 11:51 79次下载
    STM32 LoRa无线数传模块 PC通过<b class='flag-5'>串口传输</b><b class='flag-5'>数据</b>到单片机

    串口传输(51单片机版)

    串口传输在51单片机里是非常重要的一点,这常常是在中断、计数器后面学习,因为不可避免的需要用到中断。51单片机的串口,是个全双工的串口,发送数据的同时,还可以接收
    发表于 11-23 16:20 0次下载
    <b class='flag-5'>串口传输</b>(51单片机版)

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

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

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

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

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

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

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

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

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

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