Как добавить доходность перед else if?

Итак, я запускаю свой проект на NodeMCU, но я не знаю, как добавить доходность перед else if. Это даст мне такую ошибку:

Arduino:1.8.12 (Windows 10), 開發板:"NodeMCU 1.0 (модуль ESP-12E), 80 МГц, Flash, Legacy (новый может возвращать nullptr), все шифры SSL (наиболее совместимые), 4 МБ (FS :2MB OTA:~1019KB), 2, v2 Меньшая память, отключено, нет, настройки Sketch + WiFi, 115200"

G:\資優班\科展\程式碼\Front_End\Main_Code_V5\Main_Server\Main_Server.ino: В функции 'void loop()':

Main_Server:84:5: ошибка: "иначе" без предыдущего "если"

статус выхода 1 'иначе' без предшествующего 'если'

В этом отчете будет больше информации с "Показать подробный вывод во время компиляции" опция включена в Файл -> Настройки.

Вот код:

#include <SPI.h>
#include <ESP8266WiFi.h>

#define MAX_SRV_CLIENTS 2
#define led LED_BUILTIN

WiFiServer server(80);
WiFiClient serverClients[MAX_SRV_CLIENTS];
IPAddress ip(10, 241, 241, 27);
IPAddress mask(255, 255, 255, 0);
IPAddress gateway(10, 241, 241, 254);
char ssid[] = "AP";
char pass[] = "Science_Fair";

void setup() {
  Serial.begin(9600);
  WiFi.config(ip, gateway, mask);
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    yield();
  }
  server.begin();
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW);
}

void loop() {
  uint8_t i;
  Serial.setTimeout(10);
  for (i = 0; i < MAX_SRV_CLIENTS; i++) {
    Serial.println("Pre 1");
    if (server.hasClient()) {
      Serial.println("Pre 2");
      if (!serverClients[i] || !serverClients[i].connected()) {
        Serial.println("Pre 3");
        if (serverClients[i]) {
          Serial.println("Pre 4");
          serverClients[i].stop();
          Serial.println("Pre 5");
        }
        Serial.println("Pre 6");
        serverClients[i] = server.available();
        Serial.println("Pre 7");
        serverClients[i].setTimeout(10);
        Serial.println("Pre 8");
        Serial.print("New client: ");
        Serial.println("Pre 9");
        Serial.println(i);
        Serial.println("Pre 10");
        break;
      }
    }
    yield();
  }
  for (i = 0; i < MAX_SRV_CLIENTS; i++) {
    String fromClient = serverClients[i].readStringUntil('e');
    Serial.println("P1");
    yield();
    if (fromClient == "LR") {
      Serial.println("LR");
      String reply = Serial.readStringUntil('e');
      Serial.println("P2");
      yield();
      if (reply == "Warn_B") {
        yield();
        Serial.println("Confirm");
        Serial.println("P3");
        for (i = 0; i < MAX_SRV_CLIENTS; i++) {
          serverClients[i].print("Warn_B");
          Serial.println("P4");
          yield();
        }
      }
    }
    yield(); // это выход, который мне нужно добавить
    else if (fromClient == "RR") {
      Serial.println("RR");
      Serial.println("P5");
      String reply = Serial.readStringUntil('e');
      Serial.println("P6");
      yield();
      if (reply == "Warn_A") {
        Serial.println("P7");
        Serial.println("Confirm");
      }
      for (i = 0; i < MAX_SRV_CLIENTS; i++) {
        serverClients[i].print("Warn_A");
        Serial.println("P8");
        yield();
      }
    }
    yield();
  }
}

Мне нужен yield(), но я не знаю, как сделать так, чтобы он выполнял else if. Пожалуйста, помогите мне, ребята, спасибо!

, 👍0

Обсуждение

Как вы думаете, зачем вам нужна доходность там?, @Majenko

@Majenko Мм, потому что я использую свой NodeMCU, и у меня есть сторожевой таймер, я думаю, проблема в том, что он всегда выдает мне кучу ошибок, таких как feefeffe, @Sax Ted

Да, но почему там? Почему *между* двумя кусками кода, которые являются "или / или"? Если первый побежал, то второй нет. Если второй побежал, то первого не будет. В этом сценарии нет «между»., @Majenko

yield() перед if - это yield() перед else, @Juraj


1 ответ


Лучший ответ:

1

Прежде всего сделайте себе одолжение и прислушайтесь к своей IDE

This report would have more information with
 "Show verbose output during compilation"
option enabled in File -> Preferences.

и в случае если еще нет промежуточного варианта, так что либо пусть он работает как конечный автомат, особенно в вашем случае A != B != C != другое:

void subfunction(){
  if(A){
  // код для запуска
  return; 
  }
 yield();  
 if(B){
  // код для запуска
  return; 
  }
 yield();
 if(C){
  // код для запуска
  return; 
  }
 else{}  // поймать, если не A или B или C
 yield();
}

или реализовать случай переключения (псевдокод)

 switch(fromClient){
    case "LR":
      //код для запуска
      yield();
      break;
    case "RR":
      //код для запуска
      yield();
      break;
    default:
      //код для запуска
      yield();
      break;
  }

Цепочки Id else подвержены ошибкам, так как в вашем случае это A != B != C != other

,

Спасибо! Но опять же я дома, я проверю это tmr в своей лаборатории, еще раз спасибо!, @Sax Ted

почему бы не yield() после переключения?, @Juraj

Я просто скопировал его "юзкейс" но вы правы он мог сделать это даже до кейсов и в кейсе (зависит от его WD таймера, @Codebreaker007