EthernetClient неправильно инициализируется

Я пытаюсь установить соединение с EthernetClient, но он всегда терпит неудачу с кодом 0. Я решил написать небольшой код, чтобы проверить, будет ли когда-либо готов клиент, и, как я подозревал, это не так.

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = {0x2A, 0x27, 0x55, 0x08, 0x1E, 0x6A};
IPAddress ip(172, 16, 48, 133);
EthernetClient client;

void setup() {
  Ethernet.init(10);
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  while (!Serial) {;}

  for (auto link = Ethernet.linkStatus(); link != LinkON; link = Ethernet.linkStatus()) {;}
  Serial.println("Link ON");

  while(!client){
    Serial.println("Client not ready");
    delay(1000);
  }

  Serial.println("Client ready!");
}

void loop() {}

Если я попытаюсь запустить приведенный выше код, он застрянет в цикле "Клиент не готов", и я не смогу понять, чего мне не хватает, чтобы он работал.

Примечание: я уже успешно настроил веб-сервер с помощью моего щита, поэтому я предполагаю, что проблема не в нем.

, 👍0

Обсуждение

Я не уверен, почему вы оцениваете !client. Это соответствует логическому оператору, который сообщает вам, есть ли у него подключенный сокет (https://github.com/arduino-libraries/Ethernet/blob/6e9dffa64f6b0eb89607dbb5293dc33be82cc39e/src/Ethernet.h#L232). Поскольку вы не вызвали connect() на клиенте, это всегда будет возвращать false. Какая фактическая ошибка у вас есть в вашем полном скетче?, @Maximilian Gerhardt

Connect возвращает 0. Я просмотрел источник и нашел несколько точек, где он может вернуть 0, поэтому его трудно диагностировать., @Lucas Noetzold

@Maximilian [ссылка](https://www.arduino.cc/en/Reference/IfEthernetClient) говорит только, что «указывает, готов ли указанный клиент Ethernet»., @Lucas Noetzold


1 ответ


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

0

EthernetClient ожидает подключения к удаленному сокету. Ни в коем случае вы не указываете ему подключиться к сокету, поэтому он никогда не преуспевает.

В какой-то момент перед проверкой соединения вам нужно инициировать это соединение:

// arduino.cc is 100.24.172.113
IPAddress server(100, 24, 172, 113);
client.connect(server, 80);

Операция if (client) зависит от того, что sockindex было присвоено допустимое значение, и это всегда выполняется только с помощью EthernetClient::connect() или путем явного задания с помощью EthernetServer::available().

,

в этом [примере](https://www.arduino.cc/en/Reference/IfEthernetClient) это делается для проверки доступности клиента, @Lucas Noetzold

@LucasNoetzold Этот пример не имеет смысла. Как и многие на сайте Arduino это полная ерунда. Вы должны только проверить если (клиент), чтобы подтвердить, что соединение было установлено. Обычно только при использовании его в качестве входящего соединения с сервером., @Majenko

Как сказано в исходном коде: // следующая функция позволяет нам использовать клиент, возвращенный // EthernetServer:: available() как условие в операторе if. , @Majenko

Тогда мне нужно выяснить, почему connect возвращает 0. Спасибо., @Lucas Noetzold

0 указывает на ошибку разрешения DNS-имени. https://github.com/arduino-libraries/Ethernet/blob/6e9dffa64f6b0eb89607dbb5293dc33be82cc39e/src/EthernetClient.cpp#L38 @LucasNoetzold, @Maximilian Gerhardt