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, но производитель моего шилда говорит, что это так.

Также не понимаю, почему он выводит первую строку.

Спасибо за подсказки!

, 👍1

Обсуждение

Хорошо, мне пришлось внести некоторые аппаратные изменения, чтобы соответствовать расположению контактов. Теперь код работает, но интерфейс не получает желаемого 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


3 ответа


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

0

Просто чтобы получить ответ (см. комментарии): в моем случае это была странная "ошибка". После нескольких дней исследований я нашел людей с такой же проблемой, и в их случаях это помогло обрезать все контактные разъемы, кроме разъема ICSP, на 2 мм, чтобы у разъема ICSP был лучший контакт. Я попробовал это на своем щите, и это сработало.

,

0
// введите адрес вашего сервера доменных имен здесь:
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-запрос», а затем ничего, кроме сверчков....

,

3

Вы должны использовать эти библиотеки:

#include <Ethernet.h>  -->  #include <Ethernet2.h>
#include <EthernetUdp.h>  -->  #include <EthernetUdp2.h>

Дополнительная информация по этой ссылке Arduino Ethernet Shield2

,