嵌入式系统的串口数据传输都是以字节为单位,但是有些特殊的数据类型,比如浮点型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 "); }
监视结果如下所示:
我们同样适用结构体做了相同的实验,将数组s[4]={0x00,0x80,0x67,0x43}的首地址s[0]强制转换赋值给结构体z,最后打印输出的结果也是231.5
这里我们看到原本应该是0x4367_8000的数据实际存储的时候变成了00H 80H 67H 43H,这是因为计算机系统使用了小端存储,什么是小端存储呢?
我们都知道,对于一个超过一个字节的数据,其在计算机中的存储需要跨越字节。某些机器选择在存储器中按照从最低为有效字节到最高有效字节的顺序存储对象,而另一些机器则按照从最高为有效字节到到最低为有效字节的顺序存储,前一种存储方式被称为小端存储,后一种方式被称为大端存储。
举个例子,对于十六进制数0x01234567,其字节的存储顺序便依赖于机器,如下:
我们可以通过下面的函数测试是大端存储还是小端存储:
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
原文标题:串口传输数据时,结构体如何转换?
文章出处:【微信号:玩点嵌入式,微信公众号:玩点嵌入式】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论