You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 21:54:14