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() {}
Если я попытаюсь запустить приведенный выше код, он застрянет в цикле "Клиент не готов", и я не смогу понять, чего мне не хватает, чтобы он работал.
Примечание: я уже успешно настроил веб-сервер с помощью моего щита, поэтому я предполагаю, что проблема не в нем.
@Lucas Noetzold, 👍0
Обсуждение1 ответ
Лучший ответ:
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
- Разбор HTTP с аутентификацией в Arduino + Ethernet Shield
- MQTT на nano с Ethernet Shield не работает
- связь между двумя arduino с помощью ENC28J60?
- Ethernet Shield не работает с TFT-экраном
- Ограничения подключения ко многим ардуино через Ethernet?
- Modbus TCP вместе с MQTT по тому же ethernet
- Ошибка HTTP-запроса Arduino, медленное сотовое соединение
- DF Robot W5200 Ethernet Shield для Arduino Uno не работает?
Я не уверен, почему вы оцениваете
!client
. Это соответствует логическому оператору, который сообщает вам, есть ли у него подключенный сокет (https://github.com/arduino-libraries/Ethernet/blob/6e9dffa64f6b0eb89607dbb5293dc33be82cc39e/src/Ethernet.h#L232). Поскольку вы не вызвалиconnect()
на клиенте, это всегда будет возвращать false. Какая фактическая ошибка у вас есть в вашем полном скетче?, @Maximilian GerhardtConnect возвращает 0. Я просмотрел источник и нашел несколько точек, где он может вернуть 0, поэтому его трудно диагностировать., @Lucas Noetzold
@Maximilian [ссылка](https://www.arduino.cc/en/Reference/IfEthernetClient) говорит только, что «указывает, готов ли указанный клиент Ethernet»., @Lucas Noetzold