C语言符号优先级——(“++”符号的的坑)

        最近在做一个读EEPROM中的电压数据,并把数据通过CAN报文发送到上位机的功能。

        由于EEPROM读出来的数据是一个字节大小的数据,长度是8位,而电压数据大小是12位,并且,读出来后要把数据再重新整理一下。  一串电池有12个电芯,我需要获得的电压值就是12个值,EEPROM中存储的数据就是12*12/8=18个字节。同时也知道,EEPROM中的数据是按顺序存储的。

        在读到18个字节的数据后,于是小弟我就做了以下的操作:

        /*     将18个字节的EEPROM数据,转换为12个字节的电压     */

         for(i=0,j=0;i<12;i++)
        {
    if((i%2)==0)
    {
voltage_value[i]=(eeprom[j]<<4)+((eeprom[++j]&0xF0)>>4);
    }
    else
    {
voltage_value[i]=((eeprom[j]&0x0F)<<8) + eeprom[++j];
j++;
    }

        }

            获取到的电压值完全不是我想要的结果。。。。。。

            为了弄清楚咋回事,我给eeprom数组都赋了值,重新输出结果:

            /*     eeprom数组赋值,voltage_value理论结果都为0xFBD   */

            for(i=0;i<6;i++)
    {
eeprom[i*3]=0xFB;
eeprom[i*3+1]=0xDF;
eeprom[i*3+2]=0xBD;

    }

             /*     将18个字节的EEPROM数据,转换为12个字节的电压     */

            for(i=0,j=0;i<12;i++)
     {
    if((i%2)==0)
    {
voltage_value[i]=(eeprom[j]<<4)+((eeprom[++j]&0xF0)>>4);
    }
    else
    {
voltage_value[i]=((eeprom[j]&0x0F)<<8) + eeprom[++j];
j++;
    }

       }

            /* 打印结果*/

    for(i=0;i<12;i++)
    {
    printf("%x\t",voltage_value[i]);

    }

        

          仔细看打印结果,会发现第一个数据为0xdfd,就已经出了问题。

          这一句 voltage_value[i]=(eeprom[j]<<4)+((eeprom[++j]&0xF0)>>4);

           运算是先进行了“++j"的操作,因此得出来的结果是voltage_value[0]=(eeprom[1]<<4)+((eeprom[1]&0xF0)>>4);

而不是voltage_value[0]=(eeprom[0]<<4)+((eeprom[1]&0xF0)>>4);

========================华丽丽的分割线=====================================

          代码改一下:

        for(i=0,j=0;i<12;i++)
{
if((i%2)==0)
{
voltage_value[i]=(eeprom[j]<<4)+((eeprom[1+j]&0xF0)>>4);
j++;
}
else
{
voltage_value[i]=((eeprom[j]&0x0F)<<8) + eeprom[1+j];
j +=2;
}

}

        打印结果正常了

        

========================华丽丽的分割线=====================================

        或者分开来写:

        for(i=0,j=0;i<12;i++)
{
if((i%2)==0)
{
eeprom_value[i]=(eeprom[j]<<4);
eeprom_value[i] +=((eeprom[++j]&0xF0)>>4);


}
else
{
eeprom_value[i]=((eeprom[j]&0x0F)<<8);
eeprom_value[i] += eeprom[++j];
j++;
}

}

        同样没有问题了:

·        

        

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值