使用switch case函数始终进入首个case的问题排查求助
问题分析与修复方案
核心问题
case_value重复初始化:每次loop()执行时,你都把case_value设为1,这意味着程序每次循环都会从头进入case 1,永远没机会触发其他case分支。case_value类型错误:你用bool类型存储1/2/3/4,但bool只能表示0或1,2/3/4都会被隐式转换为1,直接导致case 2/3/4永远匹配不上。- if语句缺少花括号:所有if条件后都没加
{},只有紧跟的第一行代码属于条件判断范围,后面的lcd.print、delay等会无条件执行,逻辑完全混乱。
修复后的代码
// 将case_value移到loop外部,避免每次循环重置 int case_value = 1; void loop() { // 等待按钮按下 while (digitalRead(BUTTON) == HIGH) { delay(1000); Serial.println("WAITING"); lcd.setCursor(0,1); lcd.print(" PRESS TO START"); } switch (case_value) { case 1: if ((digitalRead(SW1) == LOW) && (digitalRead(SW2) == LOW) && (digitalRead(SW3) == HIGH)) { lcd.clear(); lcd.print("VERIFYING BM762"); delay(1000); Check_BM762(); case_value = 2; // 执行完成后切换到下一个case,可按需调整 } break; case 2: if ((digitalRead(SW1) == LOW) && (digitalRead(SW2) == HIGH) && (digitalRead(SW3) == LOW)) { lcd.clear(); lcd.print("VERIFYING TR"); delay(1000); Check_TR(); case_value = 3; } break; case 3: if ((digitalRead(SW1) == LOW) && (digitalRead(SW2) == HIGH) && (digitalRead(SW3) == HIGH)) { lcd.clear(); lcd.print("VERIFYING LEDs"); delay(1000); Check_LEDs(); case_value = 4; } break; case 4: if ((digitalRead(SW1) == HIGH) && (digitalRead(SW2) == LOW) && (digitalRead(SW3) == LOW)) { lcd.clear(); lcd.print("VERIFYING BM763/807"); delay(1000); Check_BM763(); case_value = 1; // 执行完成后回到初始case,可按需调整 } break; default: case_value = 1; // 默认回到初始状态 } }
额外说明
- 将
case_value类型改为int,才能正确存储1-4的数值。 - 把
case_value声明在loop()外部,确保其值在循环中不会被重置,实现分支切换。 - 所有if条件添加
{},保证代码块内的逻辑只有在条件满足时才执行。 - 可根据实际需求调整
case_value的切换逻辑,比如执行完所有case后是否循环回到初始状态。
内容的提问来源于stack exchange,提问作者Farzaneh
相关产品推荐
相关产品推荐

