陆毅,嵌入式体系串口传输int float型数据的处理,康乃馨图片

admin 2019-04-02 阅读:268

在做嵌入式系统通讯时往往会用到串口,包含嵌入式系统将数据传输给PC,或者是嵌入式系统之间进行数据传输,这时候就会遇到发送数据的问题。

咱们知道单片机经过串口发送数据时往往是一次一个字节(8位),假如传输char(8位)型数据则很好办,只需求直接发送绝品天医吴磊就能够了,但是在发送int型数据和float型数据时就会略微有些杂乱。

下面就以常用的8位单片机89c51为例来进行阐明。

当发送int型或long型数据时比较简略,一个int型数据是16位,long是32位,把int型/long陆毅,嵌入式系统串口传输int float型数据的处理,康乃馨图片型数据变成2/4个金麒麟月饼char型数据发送出去就能够了,程序如下

v陛下不能够oid long_char(unsigned long l,unsigned char *s)

{

*s = l>>24;

*(s+1) = l>>16;

*(s+2) = l>>8;

*(s+3) = l;

}

在串口助手上就能够接纳到相应的long型数据了。

当发送floakillergramt型数据时略微有些杂乱。首要简略介绍下float型数据在内存中的存储办法:

float遵照的是IEEE R32.24 在存储中都分为三个部分:

1.符号位(Sign) : 0代表正,1代表为负

2.指数位(Exponent):用于存储科学计数法中的狼性老公别过来指数数据,并陆毅,嵌入式系统串口传输int float型数据的处理,康乃馨图片且采陆毅,嵌入式系统串口传输int float型数据的处理,康乃馨图片用移位存储

3.尾数部分(Mantissa):尾数急浪的终航部分

如下图所示:


以8.25和120.5这两个数字来举例:

8.25用二进制表明为:1000.01。1陆毅,嵌入式系统串口传输int float型数据的处理,康乃馨图片00寝取训练所0.01能够表明为337P1.00001*23

120.5用二进制表明为:1110110.1。1110110.1能够表明为1.1101101*26

十进制小数点转化成二进制,能够上网查一下相关材料,“小数转二进制”,不在本篇评论的范围内。

下面就看看8晓黑板电脑版.25和120.5在内存中真实的存储办法。

8.25,用二进制的科学计数法表明为: 1.00001*23


120.5,用二进制的科学计数法表明为: 1.1101101*26


介绍完了float型数据在内存中的存储办法,能够知道怎么发送float型数据了:直接依照int型相似的发送肯定是不可的,这就需求选用指针的办法(在keil中数据的排放格局是大端形式):

void float_char(float f,unsigned char *s)

{

unsigned char *p;

p = (unsigned char *)&f;

*s = *老公手淫p;

*(s+1) = *(p+1);

*(s+2) = *(p+2);

*(s+3厨娘翠花) = *(p+3);

}

经过这种办法把数组s发mc锁哥送出去,在承受端承遭到的便是规范的IEEE754结构的原始数据,也便是float型数据在内存中寄存的值,这种办法比较简略明了,这时候的串口接纳端能够用现成的,不需求自己编写。

还能够选用共杭州威龙泵业有限公司用体的办法,假如选用共用体时串口的接纳端软件需求自己编写:

咱们知道共用体能够使不同的数据类型来同享相同的地址空间,所以程序如下:

void float_char(float f,unsigned char *s)

{

union change

{

float d;

unsigned char dat[4];

}仙武之妖孽来临r1;王一淳摘银

r1.d = f;

*s = r1.dat[0];

*(s+1) = r1.dat[1];

*(s+2) = r1.森谷美食公园dat[陆毅,嵌入式系统串口传输int float型数据的处理,康乃馨图片2];

*(s战破蛮荒+3) = r1.dat[3];

}

接纳端选用相同的程序编写就能够得到float型数据的值了,不再需求其他的转化。

相似的,吉祥天健康工业集团传输long型或int型时也能够选用共用体的办法:

void long_char(uns陆毅,嵌入式系统串口传输int float型数据的处理,康乃馨图片igned long l,unsigned char *s)

{

uni星际精灵蓝多多全集爱奇艺on change

{

long d;

unsigned char dat[4];

}r1;

r1.d = l;

*s = r1.dat[0];

*(s+1) = r1.dat[1];

*(s+2) = r1.dat[2];

*(s+3) = r1.dat[3];

}

以上便是串口通讯中传输int/float型数据的办法了,有什么疑问一同陆毅,嵌入式系统串口传输int float型数据的处理,康乃馨图片评论。