久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1840|回復: 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整個的邏輯,因為他一直為真,是這個原因嗎?還是其他什么原因呢?
回復

使用道具 舉報

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循環里的
回復

使用道具 舉報

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);
回復

使用道具 舉報

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. }
復制代碼
回復

使用道具 舉報

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,沒其他檢測代碼
回復

使用道具 舉報

ID:966423 發表于 2022-2-25 10:24 | 顯示全部樓層
沒清標志位的話程序都有運行,只是后面的那段運行較快,你顯示的時候只顯示第一次運行的那個
回復

使用道具 舉報

ID:997026 發表于 2022-2-25 10:53 | 顯示全部樓層
wulin 發表于 2022-2-25 09:23
單從樓主貼的代碼看不出有什么大問題,問題應該出在顯示代碼中。建議樓主不要在主循環中使用while(x)不確定 ...

感謝大神提供的代碼!感謝幫助!從你這里真的學到好多東西,萬分感謝!
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品一区二区不卡 | 国内自拍视频在线观看 | 国产91一区| 成人一区av | 国产成人午夜电影网 | 欧美国产精品一区二区三区 | 久久久久久亚洲精品 | 91在线导航 | 欧美精品久久久久 | 久久国产精品-国产精品 | 在线一区| 国产精品自产拍 | 欧美综合精品 | 亚洲男女视频在线观看 | 欧美一级二级三级视频 | 久久久久久美女 | 岛国毛片在线观看 | 伊人网影院 | 国产精品久久久久久久午夜片 | 毛片com| 日本精品一区二区在线观看 | 亚洲国产成人av好男人在线观看 | 久久免费香蕉视频 | 亚洲品质自拍视频 | 美女亚洲一区 | 天天天天天天操 | 四虎影院在线观看免费视频 | 日韩欧美精品一区 | 欧美一区二区三区在线播放 | 日本电影网站 | 国产精品久久久久久久久久久免费看 | 一级a性色生活片久久毛片 一级特黄a大片 | 日韩一二区 | 亚洲高清免费观看 | 欧美 日韩 国产 在线 | 中文字幕精品视频 | 日韩av一区二区在线观看 | 午夜网站视频 | 精品美女在线观看 | 精品久久电影 | 精品福利视频一区二区三区 |