最近在做一个读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++;
}

}

同样没有问题了:

·        

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

  1. C语言运算符号优先级

    1.符号概述 C语言基本上是所有语言里面运算符号最多的一种了.学习C语言不可避免要运用到运算符号.优先级和结合性是学习符号最重要的点. 2.优先级和结合性 基本优先级: 指针最优,单目运算优于双目运算 ...

  2. c语言中 ||优先级,C语言运算符号的优先级 A: B: C:|| D:|

    我知道从高到低为:圆括号 单目运算符 算术运算符 关系运算符 逻辑运算C语言运算符优先级顺序如下所示: 自增运算符 ++ 和自减运算符 ,在作后缀运算符(如表达式 x++)时,较其用作前缀运算符(如表 ...

  3. C语言基础——连续大于连续小于的多种表示方式,及符号优先级

    以 10<a<15为例 错误表示 int a = 20; printf("%b\n", 10<a<15); 输出结果为1,说明不可这样表示,但是并不报错:先 ...

  4. 编程优先级c语言,C语言中运算符号的优先级

    C语言中运算符号的优先级 发布时间:2020-06-20 16:13:39 来源:亿速云 阅读:117 作者:Leah 这期内容当中小编将会给大家带来有关C语言中运算符号的优先级,以专业的角度为大家分 ...

  5. c语言常用符号优先级问题,【C语言】符号优先级

    一. 问题的引出 今天看阿里的笔试题,看到一个非常有意思的题目,但是很容易出错. 题目:如下函数,在32bit系统foo(2^31-3)的值是: Int foo(int x) { return x&a ...

  6. Java语言中运算符号优先级

    一.运算符号优先级 二.按功能区分运算符 算术运算符:+,-,*,/,%,++,-- 赋值运算符:= 扩展后的赋值运算符:+=,-=,*=,/=,%=,&=,|=,^=,<<=,& ...

  7. 【转】C语言中的符号优先级

    转自: http://blog.csdn.net/huangblog/article/details/8271791 虽然在日常使用中,添加括号来明确规定运算符优先级是一种常识,但毕竟学校考试就喜欢考 ...

  8. c 语言运算符号大全,c语言关系运算符号有哪些?

    c语言关系运算符号有".>=.==.!=".关系运算符都是双目运算符,其的作用是判明这两个表达式的大小关系:关系运算符的优先级低于算术运算符,高于赋值运算符:其运算结果只有0 ...

  9. c语言中格式符号错误,C语言中符号格式说明

    scanf 语法: #include int scanf( const char *format, ... ); scanf()函数根据由format(格式)指定的格式从stdin(标准输入)读取,并 ...

  10. c语言中特殊符号意义,C语言特殊符号意义Word版

    <C语言特殊符号意义Word版>由会员分享,可在线阅读,更多相关<C语言特殊符号意义Word版(18页珍藏版)>请在人人文库网上搜索. 1.传播优秀Word版文档 ,希望对您有 ...

最新文章

  1. java gif 帧_在Java中修复动画gif的帧速率
  2. mysql goto,如何在MySQL存储函数中使用goto标签
  3. 【Groovy】Groovy 脚本调用 ( Linux 中调用 Groovy 脚本 | Windows 中调用 Groovy 脚本 )
  4. oracle联合主键怎么找,Oracle数据库联合主键
  5. 机器学习和深度学习资料合集
  6. SQL - 插入数据
  7. android 打好的补丁位置,Android 6.0上打完第一个补丁后再打新补丁Crash
  8. 数据分析岗位需求分析
  9. 产品设计必读书籍推荐
  10. 计算机模拟技术在高分子领域的应用,模拟技术的原理、方法及在高分子材料研究中的应用...
  11. 重构实例-消息发送-原始代码及准备-1
  12. 二维码被扫实时返回方案
  13. linux arm xenomai,Wiki - Xenomai
  14. opencv matlab配置,MATLAB配置mexopencv
  15. R语言基于mediation包行中介效应分析(2)
  16. mysql数据库备份和恢复
  17. 合并多个工作簿为一个工作簿和拆分工作簿为多个工作簿
  18. android版netspot,WiFi概观360 Pro直装解锁专业版
  19. python开发实例-python开发案例
  20. 将Openwrt路由器配置为无线交换机,实现同网段无线中继功能

热门文章

  1. 逻辑回归算法原理及python实现
  2. Janusgraph索引
  3. php paypal网站对接,php 接入 paypal 支付
  4. C++泛型编程——迭代器
  5. JDK 内置的轻量级 HTTP 服务器 --- HttpServer
  6. android addr2line 用法,Android studio中NDK开发(四)——使用addr2line分析Crash日志
  7. 计算机专业有没有3D打印,3D打印技术属于哪个专业_招生问答
  8. Java proxy 代理
  9. ISO七层协议与功能
  10. 高斯列主元消去法matlab,高斯列主元消去法解线性方程组的实现