C语言数据类型转换

Uint32   u32mmk = 123;
float32  f32mmk = 123.123;

//定义指针数组,数组元素是地址,地址指向浮点型数据
//指针数组前面的Uint32的意思是,不管数组元素指向的内容是什么数据类型,都把他解释成Uint32类型
//但是某个数据到底是什么数据类型,要和上位机约定好,上位机读取出来的数据只是二进制数,需要把他解释成对应的数据类型。

//每个大类存储20个参数,考虑到太多参数会占用太多的flash空间,暂定20个
volatile  Uint32 *u32pParaGrp1[20] = {
                       /*1*/         (Uint32 *)&u32mmk,                 //
                       //&f32mmk取这个浮点数的地址,(Uint32 *)将这个指针指向的内容解读成Uint32
                       /*2*/         (Uint32 *)&f32mmk,  //这个参数在上位机解释的时候,需要用浮点型数据装
                       /*3*/         (Uint32 *)0,        //如果要上传或者更改某个参数值,那么直接把这个变量的地址放在这里就行
                       /*4*/
                       /*5*/
                       /*6*/
                       /*7*/
                       /*8*/
                       /*9*/
                       /*10*/
                       /*11*/
                       /*12*/
                       /*13*/
                       /*14*/
                       /*15*/
                       /*16*/
                       /*17*/
                       /*18*/
                       /*19*/
                       /*20*/
};

volatile    float32 f32data1 = 0.0;
volatile    Uint32  u32data1 = 0;
volatile    int32  i32data1 = 0;
float32  f32mmmk = 123.123f;

        //u32pParaGrp1[]是个Uint32指针数组,所以每个元素指向的内容被识别成Uint32类型的,但是u32pParaGrp1[1]这个元素初始化的时候,
        //存放了一个浮点数的地址,要想存进去不报错,就要强制把这个指针转化为指向Uint32类型的指针
        //即如此转换: (Uint32 *)&f32mmk,
        //所以此时再取u32pParaGrp1[1]这个指针的内容,就是把这个浮点数的二进制码,解读成Uint32,
        u32data1 = *(u32pParaGrp1[1]);
        //把这个地址里面的二进制代码,解读成浮点数,因为本来就是个浮点数
        //(float32 *) 这是指针数据类型强制转换,表明要把其后面的地址指向的内容解读成浮点型,
        //(float32 *)(u32pParaGrp1[1]) ,不管这个指针指向的地址原来存入的是什么数据类型,现在要取出来这个存入的数据,且把他解读成float

        f32data1 = *( (float32 *)(u32pParaGrp1[1]) );
        //所以u32data1、f32data1的二进制码是一样的,都是对原始存入的哪个浮点数的不同数据类型的解读。

下载后验证:

上位机把所有的数据都按照浮点型解析,但是下位机上传的数据可能是float  u16,u32等。

例如要上传ADC寄存器的值:

//60-79
//能够上传20个U16
//数组的元素是地址,地址指向的内容只能写u16
//上位机解析都是先找浮点数解析的,所以在上传之前,要转换为浮点数。在发送的位置转换
volatile  Uint16 *u16pParaDisplay4[PARA_GROUP_MAXNUM] =
{
               //&AdcResult.ADCRESULT0 取寄存器0的地址,星号表示把这个32位数转换为地址,Uint16表示这个地址里面的内容为u16
 /*0*/         (Uint16 *)&AdcResult.ADCRESULT0,     //这个数组指针把任何类型的变量的二进制码都识别成Uint32,
 /*1*/         (Uint16 *)&AdcResult.ADCRESULT1,
 /*2*/         (Uint16 *)&AdcResult.ADCRESULT2,                           //直流输出电压(VDCout), 暂时没有,用上面的占位
 /*3*/         (Uint16 *)&AdcResult.ADCRESULT3,                             //直流输出电流(IDCout), 暂时没有,用上面的占位
 /*4*/         (Uint16 *)&AdcResult.ADCRESULT4,  //实际温度电压(VolTD)
 /*5*/         (Uint16 *)&AdcResult.ADCRESULT5,   //DSP温度(TempraDSP)
 /*7*/         (Uint16 *)&AdcResult.ADCRESULT6,
 /*8*/         (Uint16 *)&AdcResult.ADCRESULT7,  //温度环输出(TemprPIDout)
 /*9*/         (Uint16 *)&AdcResult.ADCRESULT8,    //功率环输出(PowerPIDout)
 /*10*/        (Uint16 *)&AdcResult.ADCRESULT9,                           //限流环输出(CurLoopPIDout) 暂时没有,用上面的占位
 /*11*/        (Uint16 *)&AdcResult.ADCRESULT10,                          //电压环输出(VolLoopPIDout) 暂时没有,用上面的占位
 /*12*/        (Uint16 *)&AdcResult.ADCRESULT11,
 /*13*/        (Uint16 *)&AdcResult.ADCRESULT12,
 /*14*/        (Uint16 *)&AdcResult.ADCRESULT13,
 /*15*/        (Uint16 *)&AdcResult.ADCRESULT14,
 /*16*/        (Uint16 *)&AdcResult.ADCRESULT15,
 /*17*/        (Uint16 *)&sCpu2ClaVal.u16HallGpio,

}

如上定义,然后在传送的时候

    else if((u16Addr>=60)&&(u16Addr<=79))
    {
        //unDataTypeChg.f32Data =  (float)(  ( *(u16pParaDisplay4[u16Addr-60]) )  &  (0xFFFF)  ); //一个32bit的二进制码
        
        //发送之前要转成浮点型,因为上位机都是按照浮点数解析的
        //先取出这个u16数,然后强制转换成浮点数,例如4095,转换成4095.0   
        //按照浮点型存入,发送的时候,都要按照无符号数发送,所以按照字节取出
        unDataTypeChg.f32Data =  (float) *(u16pParaDisplay4[u16Addr-60]);

        CommMsg->u16SendData[0] = (unDataTypeChg.byte.BYTE3); //取高16位的高8位
        CommMsg->u16SendData[1] = (unDataTypeChg.byte.BYTE2); //取高16位的高8位
        CommMsg->u16SendData[2] = (unDataTypeChg.byte.BYTE1);  //取低16位的高8位
        CommMsg->u16SendData[3] = (unDataTypeChg.byte.BYTE0);  //取低16位的低8位
        CommMsg->u16SendDataLen = 4;
    }

  • 12
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

量子力学和生命科学

写作提升自己,打赏更能鼓励我

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值