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++;
}

}

        同樣沒有問題了:

·        

        

        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章