Ошибка неверного использования пустого выражения.Попытка передать параметр в функцию - PullRequest
0 голосов
/ 21 июня 2019

Я пытаюсь инициализировать сервер, чтобы он выглядел как конкретные входные данные, основанные на запросе, который он получает.их много, поэтому я хочу инициализировать их циклом следующим образом:

void serverInit() {
    for (int i = 1; i <= qty; i++) {
        String s = "/readBatt" + i;
        server.on(s, runTest(i));
    }

    server.begin();
    Serial.println("Server started.");
}

Это говорит мне о том, что server.on(s, runTest(i)); является недопустимым использованием выражения void.Я знаю, что он хочет отформатировать как server.on(s, runTest), но функция runTest(int n) принимает параметр.Как я могу передать этот параметр в функцию?

Ответы [ 2 ]

2 голосов
/ 21 июня 2019

Кажется, вы используете класс WebServer из библиотек ESP32 Arduino.Как вы уже выяснили, обратный вызов, указанный в методе on(), не принимает никаких аргументов.

Однако у вас есть альтернатива.Вы можете указать «заполнитель» в URL-пути - используя фигурные скобки - {}.В обратном вызове соответствующий аргумент может быть получен с использованием метода pathArg(), который принимает индекс аргумента в качестве параметра.

Пример ...

Вы можете определить конечную точку APIкак /readBatt/<battery number>.Чтобы настроить сервер для обработки запросов к этой конечной точке, вы должны использовать что-то вроде

server.on("/readBatt/{}", runTest);

При обратном вызове вы получите первый аргумент следующим образом ...

static void runTest() {
  String batteryNumber = server.pathArg(0);
  Serial.println("Request to read battery");
  String response = "You attempted to read battery " + batteryNumber;
  response += ".\nThis endpoint is a placeholder. Check again soon!";
  server.send(200, "text/plain", response);
}

Наконец ... Предположим, что ваш ESP8266 работал на локальном IP-адресе 192.168.1.9.Вы можете получить доступ к своей новой конечной точке API, открыв в браузере

http://192.168.1.9/readBatt/1

.(Замените 1 на соответствующий номер батареи.)

Я не думаю, что есть версии pathArg(), которые, к сожалению, возвращают целое число, поэтому вам, возможно, придется выполнить преобразование в какой-то момент.

1 голос
/ 22 июня 2019

Вы можете использовать то, что называется «закрытием».Замыкание позволяет вам составить функцию, которая сохраняет доступ к переменным вне ее области действия.

Замыкание пишется с использованием «лямбда-выражения» - в основном анонимной функции.Синтаксис C ++ для лямбда-выражений выглядит следующим образом:

[capture variable list](argument list) { body}

Список переменных захвата - это список переменных, которые вы хотите сделать доступными внутри тела.Список аргументов - это обычный список аргументов функции, который передается вызывающей стороной.Вы должны написать лямбда-выражение, которое вам нужно, так:

[i]() { runTest(i); }

и использовать его так:

server.on(s, [i]() { runTest(i); });

Чтобы было ясно, ответ @David Collins - лучший способнаписать веб-сервер.Использование параметра в URL-адресе лучше, чем создание нескольких URL-адресов со встроенным в них параметром.Я просто отвечаю на вопрос о том, как передать параметр в функцию, которая вызывается без аргументов.Если вы пишете код веб-сервера лучше, вам не нужно этого делать (хотя я бы сделал проверку границ для значения, переданного в URL, чтобы убедиться, что вы получаете правильный номер батареи).

...