找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1011|回复: 9
打印 上一主题 下一主题
收起左侧

C语言while嵌套中,判断条件改变后,执行程序为啥没有改变?

[复制链接]
跳转到指定楼层
楼主
ID:997026 发表于 2022-2-24 23:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我做一个方案,就是做一个小的监控器(带显示屏),随时监控设备运行情况,当设备发生紧急情况时,监控器立即启动报警,同时显示屏上显示对应的故障码。

紧急情况有两种,设备过流(对应故障码E1),以及设备过载(对应故障码E2).

紧急情况的优先级最高,当程序正常运行时,一旦发生紧急情况,无论当前在运行什么程序,必须无条件跳转到紧急情况程序中,紧急情况结束后,再自动返回到之前运行的程序中。

程序框架如下:

int  main(void)
{

uint8_t   over_current_flag=1;  //过流发生标志位, 当为低时,表示过流发生,下同
uint8_t   over_load_flag=1; //设备过载标志位

while(1)
{

   normal_run(); //正常运行程序,即时监控

   while(!over_current_flag || !over_load_flag)  //检测到低电平时,立即跳转到该循环

    ErrorCode_DISPALY() ;  //根据发生实际情况,显示E1, E2, 或两种同时发生时,组合显示E1,E2

}

}



void  ErrorCode_DISPLAY()
{
if(!over_current_flag)
E1_DISPLAY(); //过流时显示E1

if(!over_load_flag)
E2_DISPLAY(); //过载时显示E2

if(!over_current_flag && !over_load_flag)
E12_DISPLAY(); //过流和过载同时发生,显示屏同时显示E1和E2

}


现在的问题是:
如果只发生一种, 比如E1或E2,显示屏可以正常显示,没问题。如果发生了过流,显示屏显示E1, 过了一会,又发生了过载,可是仍然显示的是E1. 并不会同时显示E1,E2, 这是为何呢?
当发生E1时,由于 while循环中while(!over_current_flag || !over_load_flag) 用的是||,只要有一个为真就执行程序,此时!over_current_flag 为真,开始执行程序。后来当!over_load_flag也为真时,并没有改变!over_current_flag || !over_load_flag整个的逻辑,因为他一直为真,是这个原因吗?还是其他什么原因呢?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:272119 发表于 2022-2-25 08:20 | 只看该作者
个人浅见,首先逻辑没有理清12状态独立区分,一旦发生12,首先是1,然后2,然后如果没有什么处理12依然会显示.和while没有大关系.
回复

使用道具 举报

板凳
ID:584814 发表于 2022-2-25 08:26 | 只看该作者
E1发生后,是否卡死在报警而不去检测了 ?
只给出片段让大家猜谜真的不好玩
回复

使用道具 举报

地板
ID:625730 发表于 2022-2-25 09:18 | 只看该作者
是你说的情况,过流如果不消除,就一直在执行while循环里的
回复

使用道具 举报

5#
ID:625730 发表于 2022-2-25 09:21 | 只看该作者
如果需要区分,就要做更多的逻辑判断,比如只有过流while(!over_current_flag &&over_load_flag),过流和过载同时有,while(!over_current_flag && !over_load_flag);
只有过载while(over_current_flag && !over_load_flag);
回复

使用道具 举报

6#
ID:213173 发表于 2022-2-25 09:23 | 只看该作者
单从楼主贴的代码看不出有什么大问题,问题应该出在显示代码中。建议楼主不要在主循环中使用while(x)不确定的长时间等待,而是要让程序不停跑起来。
  1. void main(void)
  2. {
  3.         uint8_t   over_current_flag=1;  //过流发生标志位, 当为低时,表示过流发生,下同
  4.         uint8_t   over_load_flag=1; //设备过载标志位
  5.         uint8_t   state=0,state_A=0;//状态变量

  6.         while(1)
  7.         {
  8.                 if(!over_current_flag || !over_load_flag)  //检测到低电平时
  9.                 {

  10.                         if(!over_current_flag && !over_load_flag) state=4; //过流和过载同时发生

  11.                         else if(!over_current_flag) state=2;//过流
  12.                        
  13.                         else state=3;//过载

  14.                 }
  15.                 else state=1; //正常

  16.                 if(state_A != state)//即时监控,当状态发生变化时
  17.                 {
  18.                         state_A = state;//保存当前状态
  19.                         ErrorCode_DISPLAY(state);//更新显示
  20.                 }
  21.         }
  22. }

  23. void  ErrorCode_DISPLAY(uint8_t Code)
  24. {
  25.         switch(Code)
  26.         {
  27.                 case 1: /*显示正常  */ break;
  28.                 case 2: /*显示E1    */ break;
  29.                 case 3: /*显示E2    */ break;
  30.                 case 4: /*显示E1、E2*/ break;
  31.                 default:/*          */ break;
  32.         }
  33. }
复制代码
回复

使用道具 举报

7#
ID:997026 发表于 2022-2-25 09:56 | 只看该作者
man1234567 发表于 2022-2-25 08:26
E1发生后,是否卡死在报警而不去检测了 ?
只给出片段让大家猜谜真的不好玩

检测主要是硬件检测的,软件上很简单,就是用这两个变量over_current_flag  和over_load_flag来监控的,因为这两个变量是直接连接到单片机IO口的,如果IO口变为低,over_current_flag  和over_load_flag就为0,反之为1,没其他检测代码
回复

使用道具 举报

8#
ID:966423 发表于 2022-2-25 10:24 | 只看该作者
没清标志位的话程序都有运行,只是后面的那段运行较快,你显示的时候只显示第一次运行的那个
回复

使用道具 举报

9#
ID:997026 发表于 2022-2-25 10:53 | 只看该作者
wulin 发表于 2022-2-25 09:23
单从楼主贴的代码看不出有什么大问题,问题应该出在显示代码中。建议楼主不要在主循环中使用while(x)不确定 ...

感谢大神提供的代码!感谢帮助!从你这里真的学到好多东西,万分感谢!
回复

使用道具 举报

10#
ID:123289 发表于 2022-2-26 11:15 | 只看该作者
因为你是循环做事的:
E1时,就去除了E2
E2时,又不做E1了
E1、E2时,虽然都做了,但旋即你又循环加头,做E1,去除了E2……
总体年上去,E1、E2时你不断的切换,改变显示方式
明白道理就知道如何处理了。方法很多,这里说两个:
1、先判E1E2,是,显示退出;再判E1,是,显示退出;最后再E2……。(要点,每个做完退出,复杂的先做)
2、先清显示;再分别判E1、E2,无需判E1E2同时,重点来了:显示E1时不清E2,显示E2时也不清E1。即让E1与E2在表达上(显示上)无关联。
以上1、2、都能达成目的,但不是很好的方案,自己再想更好的方案吧。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表