Есть ли способ автоматически передать EthernetClient для работы вне цикла?

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

void displayButton(String toggleName, byte toggle, byte link1, EthernetClient & client, boolean last) {
  if (toggle == 0) client.print("<a href=\"/?");
  else client.print("<a class=\"linkSelected\" href=\"/?");
  client.print(link1);
  client.print("\">");
  client.print(toggleName);
  client.print("</a>");
  if (last) client.print("<br><br>");
}

И это сокращенная версия моей функции цикла:

void loop() {
  EthernetClient client = server.available();
  if (client) {
    boolean done = false;
    while (client.connected() && !done)
    {
      while (client.available () > 0 && !done)
        done = processIncomingByte (client.read ());
    }  // end of while client connected
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println();
      client.print("<HTML><HEAD>");
      displayButton("F8", f8Toggle, 57, client, 0);
      displayButton("F9", f9Toggle, 58, client, 0);
      displayButton("F10", f10Toggle, 59, client, 1);
      client.println("</center></body></html>");
      delay(5); client.stop();
  } // end of "if client"
} // end of loop

Мне интересно, есть ли какой-либо способ заставить функцию displayButton использовать экземпляр EthernetClient без необходимости передавать его каждый раз. Я заинтересован в этом для того, чтобы немного очистить свой код (так как я смог бы удалить 73 экземпляра слова "клиент"), а также в качестве учебного опыта.

, 👍0

Обсуждение

Если "клиент" является глобальным, то он уже знает об этом., @Majenko

Когда я пытался удалить переданного клиента, я получал "" клиент "не был объявлен в этой области" для функции displayButton. Повлияет ли это вообще на веб-сервер, если я определю "клиент EthernetClient;" перед функциями настройки и цикла? Я только что протестировал это, и, похоже, это работает, но я сомневаюсь в этом, потому что никогда не видел этого ни в одном другом коде веб-сервера., @Jerry

До тех пор, пока вы удаляете "EthernetClient" перед "клиентом" в " цикле ()"., @Majenko

Спасибо! Похоже, это отличное решение! Я проверю позже, и если ответов не будет, я опубликую ваш ответ в качестве решения., @Jerry


1 ответ


1

Как отметил Майенко в комментариях, решением было объявить "клиент EthernetClient;" в качестве глобальной переменной вне цикла. Обычно я бы попробовал что-то подобное самостоятельно, но не решался сделать это, потому что никогда не видел ничего подобного в другом коде.

,

Использование глобальных переменных обычно считается признаком плохого дизайна (это может привести к некоторым ошибкам, которым локальная переменная подвержена в меньшей степени), поэтому вы не очень часто видите это. Переменная "клиент" в вашей программе является одним из исключений, когда ее глобализация, вероятно, уменьшает, а не увеличивает вероятность ошибок., @JRobert