如何将ESP32D Web服务器的if/else if代码重构为switch case?
ESP32 Web服务器control函数重构:if/else转switch-case
你当前的control函数通过多段if/else if判断HTTP请求头中的路径控制GPIO,代码冗余度高。直接基于indexOf的返回值无法使用switch-case(因为返回的是匹配位置,不是固定枚举值),可以先将匹配的请求映射为唯一整数标识,再通过switch-case处理,具体实现如下:
步骤1:定义命令标识常量
先给每个控制命令定义唯一的整数常量,方便switch-case判断:
// 定义各控制命令的唯一标识 #define CMD_GPIO2_ON 1 #define CMD_GPIO2_OFF 2 #define CMD_GPIO15_ON 3 #define CMD_GPIO15_OFF 4
步骤2:重构control函数
先通过indexOf匹配请求,将对应命令赋值给整数变量,再用switch-case执行对应逻辑:
void control() { int cmd = 0; // 默认无匹配命令 // 先匹配请求,映射为对应命令标识 if (header.indexOf("GET /2/on") >= 0) { cmd = CMD_GPIO2_ON; } else if (header.indexOf("GET /2/off") >= 0) { cmd = CMD_GPIO2_OFF; } else if (header.indexOf("GET /15/on") >= 0) { cmd = CMD_GPIO15_ON; } else if (header.indexOf("GET /15/off") >= 0) { cmd = CMD_GPIO15_OFF; } // 用switch-case处理各命令逻辑 switch(cmd) { case CMD_GPIO2_ON: Serial.println("GPIO 2 on"); output2State = "on"; digitalWrite(output2, HIGH); break; case CMD_GPIO2_OFF: Serial.println("GPIO 2 off"); output2State = "off"; digitalWrite(output2, LOW); break; case CMD_GPIO15_ON: Serial.println("GPIO 15 on"); output15State = "on"; digitalWrite(output15, HIGH); break; case CMD_GPIO15_OFF: Serial.println("GPIO 15 off"); output15State = "off"; digitalWrite(output15, LOW); break; default: // 无匹配命令时可添加默认处理逻辑(可选) break; } }
进阶优化(可选)
如果后续要添加更多GPIO控制,可以进一步提取GPIO编号和开关状态,避免重复代码:
void control() { int targetGpio = -1; bool turnOn = false; // 匹配请求并提取GPIO编号和状态 if (header.indexOf("GET /2/on") >= 0) { targetGpio = 2; turnOn = true; } else if (header.indexOf("GET /2/off") >= 0) { targetGpio = 2; turnOn = false; } else if (header.indexOf("GET /15/on") >= 0) { targetGpio = 15; turnOn = true; } else if (header.indexOf("GET /15/off") >= 0) { targetGpio = 15; turnOn = false; } // 统一处理GPIO控制 if (targetGpio != -1) { Serial.printf("GPIO %d %s\n", targetGpio, turnOn ? "on" : "off"); digitalWrite(targetGpio, turnOn ? HIGH : LOW); // 用数组管理状态变量,替代单个outputXState // 需提前定义:String gpioStates[32] = {"off"}; // ESP32最多支持32个GPIO gpioStates[targetGpio] = turnOn ? "on" : "off"; } }
内容的提问来源于stack exchange,提问作者Daniel Martinez
相关产品推荐
相关产品推荐

