Arduino Ethernet Shield 2 застрял на EthernetServer::begin()
В настоящее время я пытаюсь заставить Ethernet Shield работать на моем Mega. Я пытался запустить пример веб-сервера, но программа зависла в какой-то момент, поэтому я попытался начать с нуля.
Это мой тестовый код:
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = {
0x90, 0xA2, 0xDA, 0x0F, 0xF6, 0x3D
};
byte subnet[] = { 255,0,0,0 };
byte gateway[] = { 2,0,0,1 };
IPAddress ip(2, 0, 0, 1);
EthernetServer server(80);
void setup() {
Serial.begin(9600);
Ethernet.begin(mac, ip, gateway, subnet);
Serial.println("Ethernet started");
server.begin();
Serial.println("Server started");
}
void loop() {
// поместите сюда ваш основной код для многократного запуска:
Serial.println("Loop");
}
Вывод, который я получаю из последовательной консоли:
Etrted
Ethernet started
Поэтому я думаю, что программа застревает внутри функции EthernetServer::begin(). Я знаю, что существуют более ранние версии ethernet-шилдов, которые несовместимы с mega, но производитель моего шилда говорит, что это так.
Также не понимаю, почему он выводит первую строку.
Спасибо за подсказки!
@julianrabe, 👍1
Обсуждение3 ответа
Лучший ответ:
Просто чтобы получить ответ (см. комментарии): в моем случае это была странная "ошибка". После нескольких дней исследований я нашел людей с такой же проблемой, и в их случаях это помогло обрезать все контактные разъемы, кроме разъема ICSP, на 2 мм, чтобы у разъема ICSP был лучший контакт. Я попробовал это на своем щите, и это сработало.
// введите адрес вашего сервера доменных имен здесь:
IPAddress myDns(192,168,1,1);
// инициализируем экземпляр библиотеки:
EthernetClient client;
char server[] = "www.arduino.cc";
unsigned long lastConnectionTime = 0;
// последний раз, когда вы подключались к серверу, в миллисекундах
boolean lastConnected = false;
// состояние соединения в прошлый раз через основной цикл
const unsigned long postingInterval = 14*1000;
// задержка между обновлениями в миллисекундах
void setup() {
pinMode (pin, OUTPUT);
digitalWrite (pin, LOW);
// запускаем последовательный порт:
Serial.begin(9600);
// дать модулю Ethernet время для загрузки:
delay(1000);
// запускаем соединение Ethernet с использованием фиксированного IP-адреса и DNS-сервера:
Ethernet.begin(mac, ip, myDns);
// напечатать IP-адрес платы/экрана Ethernet:
Serial.print("My IP address: ");
Serial.println(Ethernet.localIP());
}
void loop() {
// если есть входящие данные из сетевого соединения.
// отправить его через последовательный порт. Это для отладки
// только цели:
if (client.available()) {
Serial.println ("1"); delay(500);
char c = client.read();
Serial.print(c);
} else {Serial.println ("11");delay (500);}
// если нет подключения к сети, но оно было в прошлый раз
// через цикл, затем останавливаем клиент:
if (!client.connected() && lastConnected) {
Serial.println(2); delay(500);
Serial.println();
Serial.println("disconnecting.");
client.stop();
} else {Serial.println ("22");delay (500);}
// если вы не подключены и прошло десять секунд с момента
// ваше последнее соединение, затем снова подключитесь и отправьте данные:
if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
Serial.println(3); delay(500);
httpRequest();
Serial.println ("4");delay (100);
} else {Serial.println ("33");delay (500);}
// сохраняем состояние соединения для следующего раза через
// петля:
lastConnected = client.connected();
Serial.println ("end loop");
}
// этот метод устанавливает HTTP-соединение с сервером:
void httpRequest() {
// если есть успешное соединение:
Serial.println ("httpRequest"); delay(500);
if (client.connect(server, 80)) {
Serial.println ("H1"); delay(500);
Serial.println("connecting...");
// отправляем HTTP-запрос PUT:
client.println("GET /latest.txt HTTP/1.1");
client.println("Host: www.arduino.cc");
client.println("User-Agent: arduino-ethernet");
client.println("Connection: close");
client.println();
// обратите внимание на время установления соединения:
lastConnectionTime = millis();
} else {
Serial.println ("H11"); delay(500);
// если не удалось установить соединение:
Serial.println("connection failed");
Serial.println("disconnecting.");
client.stop();
}
}
Я вставил строки отладки. все, что я получаю, это неудачные комментарии «если». через 15 секунд я получаю отладку № 3, а затем «HTTP-запрос», а затем ничего, кроме сверчков....
Вы должны использовать эти библиотеки:
#include <Ethernet.h> --> #include <Ethernet2.h>
#include <EthernetUdp.h> --> #include <EthernetUdp2.h>
Дополнительная информация по этой ссылке Arduino Ethernet Shield2
- Arduino Ethernet Shield при использовании контактов Arduino Mega
- Удаленная загрузка кода на плату Arduino через интернет
- Arduino Ethernet Shield 2: Как автоматически определить MAC-адрес?
- Как сделать веб сервер arduino через USB? Без ethernet shield и чипа wifi
- Использовать Ethernet Shield и RFID rc522 вместе на мега
- Arduino не подключается к локальному брокеру MQTT
- Как отправить информацию с сайта на ардуино?
- Arduino Ethernet Shield: "no matching function for call to 'EthernetClass::begin()'"
Хорошо, мне пришлось внести некоторые аппаратные изменения, чтобы соответствовать расположению контактов. Теперь код работает, но интерфейс не получает желаемого IP-адреса. Вместо того, чтобы выводить правильный IP-адрес, последовательная консоль печатает только 255.255.255.255 или 0.0.0.0 случайным образом. Есть намеки на это?, @julianrabe
Теперь я знаю, что 0.0.0.0 возникает, когда для контакта 53 (SS, фактический контакт 10 на экране Ethernet) установлено значение LOW, а 255.255.255.255 возникает, когда для контакта 53 установлено значение HIGH (отключение Ethernet). Во всех случаях контакт 4 (SD_CS) устанавливается в состояние HIGH, чтобы отключить устройство чтения SD-карт., @julianrabe