拆分组合字节

2018-01-22  本文已影响0人  guanjianhe

在单片机中,和上位机通讯一般是用串口。如果要发送一个数据123.4,有两种方法:

  1. 把123.4转化为数据串,也就是“123.4”,然后再通过串口一个字节一个字节发送。
  2. 把浮点型数据拆分成一个个单字符,然后通过串口发送到上位机,最后再在上位机组合,例子如下。
#include <stdio.h>
#include <string.h>

#define BYTE0(dwTemp)       ( *( (char *)(&dwTemp)    ) )
#define BYTE1(dwTemp)       ( *( (char *)(&dwTemp) + 1) )
#define BYTE2(dwTemp)       ( *( (char *)(&dwTemp) + 2) )
#define BYTE3(dwTemp)       ( *( (char *)(&dwTemp) + 3) )



union Test
{
    char carr[4];
    float fdata;
};

int main(void)
{
    union Test test;
    float f=123.4f;
    char *pf;
    char num1[4],num2[4],num3[4],num4[4],num5[4];
    int i;
    float f1,f2,f3,f4,f5;
    /* 浮点数拆分成多字节数据 */
    //第一种方法
    test.fdata = f;
    for(i=0;i<4;i++)
    {
        num1[i] = test.carr[i];
    }
    
    //第二种方法
    num2[0] = BYTE0(f);
    num2[1] = BYTE1(f);
    num2[2] = BYTE2(f);
    num2[3] = BYTE3(f);

    //第三种方法
    pf=(char *)(&f);
    for(i=0;i<4;i++)
    {
        num3[i]=*(pf+i);
    }
    //第四种方法
    memcpy(num4,&f,sizeof(char)*4);
    //第五种方法
    (*((float *)num5)) = f; 

    

    for(i=0;i<4;i++)
    {
        printf("num1=%X\tnum2=%X\tnum3=%X\tnum4=%X\tnum5=%X\n",num1[i]&0xFF,num2[i]&0xFF,num3[i]&0xFF,num4[i]&0xFF,num5[i]&0xFF);
    }

    /* 多字节数据合成一个浮点数 */
    //第一种方法
    for(i=0;i<4;i++)
    {
        test.carr[i]=num1[i];
    }
    f1 = test.fdata;


    //第二种方法
    BYTE0(f2) = num2[0];
    BYTE1(f2) = num2[1];
    BYTE2(f2) = num2[2];
    BYTE3(f2) = num2[3];

    //第三种方法
    pf = (char *)(&f3);
    for(i=0;i<4;i++)
    {
        *(pf+i) = num3[i];
    }

    //第四种方法
    memcpy(&f4,num4,sizeof(char)*4);
    //第五种方法
    f5 = (*((float *)num5));

    printf("\nf1=%f\tf2=%f\tf3=%f\tf4=%f\tf5=%f\n",f1,f2,f3,f4,f5);

    return 0;
}

/***********************************************************************************
num1=CD num2=CD num3=CD num4=CD num5=CD
num1=CC num2=CC num3=CC num4=CC num5=CC
num1=F6 num2=F6 num3=F6 num4=F6 num5=F6
num1=42 num2=42 num3=42 num4=42 num5=42

f1=123.400002   f2=123.400002   f3=123.400002   f4=123.400002   f5=123.400002
***********************************************************************************/

上一篇 下一篇

猜你喜欢

热点阅读