最近在做一个读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++;
}
}
同样没有问题了:
·