Unicast-Verbinung ohne DHCP-Server nur möglich wenn DHCP-Anfrage fehlschlägt

Hallo zusammen,

Ich möchte eine Unicast-Verbindung zu einem Gerät in meinem Netzwerk herstellen, welches sobald sich ein anderes Gerät mit ihm verbindet, seine gesamte Konfiguration an dieses sendet.

Mein Netzwerk:
Besteht nur aus einem Switch an dem ca. 15 Geräte hängen. Es gibt keinen Router und demnach auch keine Verbindung ins Internet. Auch einen DHCP-Server sucht man vergeblich.

Mein Arduino-Setup:
Ich benutze einen originalen Arduino Uno SMD R3 auf dem ein originales Arduino Ethernet Shield 2 sitzt. Der Uno ist via USB an meinen PC angeschlossen, das Ethernet Shield ist via LAN mit meinen Switch verbunden.

Mein bisheriges Vorgehen:
Ich habe das Beispiel "WebClient" aus der Arduino Ethernet Library verwendet und es etwas für mich angepasst (siehe Code 1 unten).
Wie aus meinem Code 1 hervorgeht macht der Arduino erst eine DHCP-Anfrage, stellt dann fest das es keinen DHCP-Server gibt und nimmt die eingetragene IP- und DNS-Adresse. Im Serielen Monitor bekomme ich dann meine Daten (die Konfiguration des Geräts).
Soweit so gut.
Da ich meine IP nicht über einen DHCP beziehen möchte (und auch nicht kann weil es keinen DHCP-Server gibt) habe ich den Code nochmal ein wenig umgeschrieben (siehe Code 2) und folgendes festgestellt:

Das Problem:
Wenn ich Ethernet.begin direkt mit meiner IP-Adresse verwende, kann keine Verbindung zum Zielgerät aufgebaut werden. Wenn ich es erst mit einem DHCP versuche, feststelle das es keinen gibt und dann Ethernet.begin mit IP-Adresse verwende geht es!

Ich hab mir die Library mal kurz angeschaut, finde aber nichts (kann auch sein das ich da nicht ganz durchblicke).

Wäre über eine Antwort sehr dankbar!

Grüße jjw2202

Hier noch mein Code:

Code 1

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress server(10,1,22,30);

IPAddress ip(10, 1, 22, 77);
IPAddress myDns(10, 1, 22, 1);

EthernetClient client;

unsigned long beginMicros, endMicros;
unsigned long byteCount = 0;
bool printWebData = true;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ;
  }

  Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");

    if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
      while (true) {
        delay(1);
      }
    }
    if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }

    Ethernet.begin(mac, ip, myDns);
  } else {
    Serial.print("  DHCP assigned IP ");
    Serial.println(Ethernet.localIP());
  }

  delay(1000);
  Serial.print("connecting to ");
  Serial.print(server);
  Serial.println("...");

  if (client.connect(server, 9990)) {
    Serial.print("connected to ");
    Serial.println(client.remoteIP());
  } else {
    Serial.println("connection failed");
  }
  beginMicros = micros();
}

void loop() {
  int len = client.available();
  if (len > 0) {
    byte buffer[80];
    if (len > 80) len = 80;
    client.read(buffer, len);
    if (printWebData) {
      Serial.write(buffer, len);
    }
    byteCount = byteCount + len;
  }

  if (!client.connected()) {
    endMicros = micros();
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    Serial.print("Received ");
    Serial.print(byteCount);
    Serial.print(" bytes in ");
    float seconds = (float)(endMicros - beginMicros) / 1000000.0;
    Serial.print(seconds, 4);
    float rate = (float)byteCount / seconds / 1000.0;
    Serial.print(", rate = ");
    Serial.print(rate);
    Serial.print(" kbytes/second");
    Serial.println();

    while (true) {
      delay(1);
    }
  }
}

Code 2

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress server(10,1,22,30);

IPAddress ip(10, 1, 22, 77);
IPAddress myDns(10, 1, 22, 1);

EthernetClient client;

unsigned long beginMicros, endMicros;
unsigned long byteCount = 0;
bool printWebData = true;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ;
  }


  Ethernet.begin(mac, ip, myDns);

  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1);
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }
  
  delay(1000);
  Serial.print("connecting to ");
  Serial.print(server);
  Serial.println("...");

  if (client.connect(server, 9990)) {
    Serial.print("connected to ");
    Serial.println(client.remoteIP());
  } else {
    Serial.println("connection failed");
  }
  beginMicros = micros();
}

void loop() {
  int len = client.available();
  if (len > 0) {
    byte buffer[80];
    if (len > 80) len = 80;
    client.read(buffer, len);
    if (printWebData) {
      Serial.write(buffer, len);
    }
    byteCount = byteCount + len;
  }

  if (!client.connected()) {
    endMicros = micros();
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    Serial.print("Received ");
    Serial.print(byteCount);
    Serial.print(" bytes in ");
    float seconds = (float)(endMicros - beginMicros) / 1000000.0;
    Serial.print(seconds, 4);
    float rate = (float)byteCount / seconds / 1000.0;
    Serial.print(", rate = ");
    Serial.print(rate);
    Serial.print(" kbytes/second");
    Serial.println();

    while (true) {
      delay(1);
    }
  }
}

jjw2202:
Wenn ich Ethernet.begin direkt mit meiner IP-Adresse verwende, kann keine Verbindung zum Zielgerät aufgebaut werden. Wenn ich es erst mit einem DHCP versuche, feststelle das es keinen gibt und dann Ethernet.begin mit IP-Adresse verwende geht es!

Das erinnert mich an was...
Mach mal ein delay rein...

Serial.begin(9600);
while (!Serial) {
  ;
}

delay(1000);
Ethernet.begin(mac, ip, myDns);

Und Frage: Einen DHCP und einen Gateway hast nicht, einen DNS schon?

Die Idee mit dem delay ist mir auch schon gekommen. Habe ich auch schon versucht, das ändert nichts.

Zu deiner Frage:
Ich habe auch kein DNS, aber im Beispiel war die Adresse eben mit angegeben. Wenn ich es weg lasse wird als DNS meine IP mit einer "1" im letzten Oktett genommen. Kommt aufs gleiche raus.

jjw2202:
Ich habe auch kein DNS

Da ich die selbe Konfig habe mal kurz umgebaut und getestet...
Geht.

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress server(10, 1, 22, 30);
IPAddress ip(10, 1, 22, 77);

EthernetClient client;

unsigned long beginMicros, endMicros;
unsigned long byteCount = 0;
bool printWebData = true;

void setup() {
  Serial.begin(115200);
  while (!Serial) {
    ;
  }
  Serial.println("Initialize Ethernet:");
  Ethernet.begin(mac, ip);
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1);
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }
  else
  {
    Serial.print("assigned IP: ");
    Serial.println(Ethernet.localIP());
  }
  delay(1000);
  Serial.print("connecting to ");
  Serial.print(server);
  Serial.println("...");
  if (client.connect(server, 9990)) {
    Serial.print("connected to ");
    Serial.println(client.remoteIP());
  } else {
    Serial.println("connection failed");
  }
  beginMicros = micros();
}

void loop() {
  int len = client.available();
  if (len > 0) {
    byte buffer[80];
    if (len > 80) len = 80;
    client.read(buffer, len);
    if (printWebData) {
      Serial.write(buffer, len);
    }
    byteCount = byteCount + len;
  }

  if (!client.connected()) {
    endMicros = micros();
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    Serial.print("Received ");
    Serial.print(byteCount);
    Serial.print(" bytes in ");
    float seconds = (float)(endMicros - beginMicros) / 1000000.0;
    Serial.print(seconds, 4);
    float rate = (float)byteCount / seconds / 1000.0;
    Serial.print(", rate = ");
    Serial.print(rate);
    Serial.print(" kbytes/second");
    Serial.println();

    while (true) {
      delay(1);
    }
  }
}

Erstmal danke für deinen Aufwand!

Ich habe deinen Code bei mir ausprobiert und er funktioniert bei mir nicht.
Wenn ich in meinem Code 2 bei Ethernet.begin nur mac und ip übergebe funktioniert es auch nicht.

Ich hab auch das delay nochmal ausprobiert und bin auf folgendes gestoßen:
bei einem delay von 1 Sekunde funktioniert es nicht. Wenn ich jedoch 60 Sekunden warte (so lange hat es ca. auch mit DHCP-Anfrage gedauert) funktioniert es.
Ich hab dann mal ein wenig eingeschränkt und hab herausgefunden das ich mindestens 28 Sekunden warten muss damit es funtioniert.

Mit delay funktioniert dein und mein Code.

Schön ist das nicht... also wäre es cool wenn ich es auch ohne delay hinbekomme (oder mit einem deutlich geringeren).

jjw2202:
Erstmal danke für deinen Aufwand!

Ich hab dann mal ein wenig eingeschränkt und hab herausgefunden das ich mindestens 28 Sekunden warten muss damit es funtioniert.

Schön ist das nicht... also wäre es cool wenn ich es auch ohne delay hinbekomme (oder mit einem deutlich geringeren).

Also ich kann das nicht so nachvollziehen.
Ich hab das heute morgen so aufgebaut und hab mit Deinen Einstelungen noch die Ausgabe hier - war das letzte was ich gebastelt hatte... :wink:

12:03:39.050 -> Initialize Ethernet:
12:03:39.614 -> assigned IP: 10.1.22.77
12:03:40.608 -> connecting to 10.1.22.30...
12:03:41.603 -> connection failed
12:03:41.603 -> 
12:03:41.603 -> disconnecting.
12:03:41.603 -> Received 0 bytes in 0.0000, rate = 0.00 kbytes/second

Wenn das delay() nicht drin wäre, wäre es durchgelaufen.
Also ist irgendwas faul.

Hängt da noch was an der Kombi UNO/Ethernet 2?
Mit was versorgst Du den?

Ich verstehe es auch nicht...

Ich hab wie gesagt einen originalen Uno, auf dem ein originales Ethernet Shielt 2 (ohne PoE) steckt. Das Shielt ist via LAN mit meinem Switch verbunden. Strom bekommt der Uno über USB (darüber läuft auch die Serielle Kommunikation).

Ich kann es heute Mittag auch nochmal mit einer anderen Kombi (hab noch ein Shield und einen Mega) probieren.

jjw2202:
nochmal mit einer anderen Kombi (hab noch ein Shield und einen Mega) probieren.

... und evtl. mal mit nem Netzteil versorgen.
irgendwas zwischen 7 und 12V.

Also ich habe es nochmal mit verschiedenen Unos, Megas und Shields versucht. Auch mit externer Stromversorgung.
Nach wie vor kann ich eine Verbindung nur mit einem delay von min. 28 Sekunden herstellen.

Daraufhin habe ich den Beispiel Code "WebClient" nochmal genommen und meinen Arduino in ein anders, internetfähiges Netzwerk gehangen. DHCP im Code wieder durch statische IP ersetzt und probiert. Auch hier das Problem. Mit delay funktioniert es, ohne nicht.

jjw2202:
Mit delay funktioniert es, ohne nicht.

Da ist was faul.

Welche IDE-Version benutzt Du?
Welche libs sind installiert?
Bitte unter DATEI-VOREINSTELLUNGEN den Haken setzen bei "Ausführliche Ausgabe während [+] Kompiliereung
Und das Feld "Compiler-Warnungen" auf alle stellen.

Nach dem kompilieren alles was unten im schwarzen Fenster ist hier (in codetags) reinkippen.
Bitte unbedingt die IDE neustarten, den Sketch laden und kompilieren dann die Ausgaben hier rein.
Nicht ein zweites Mal kompilieren.

Arduino Version: 1.8.13
Ich habe nur die Standart Librarys installiert. Laut Bibliothekverwalter sind alle aktuell. Auch die Boards (laut Boardverwalter) sind aktuell.

Wenn ich kompiliere (mit den Voreinstellungen wie du geschrieben hast) kommt folgendes (gesamter Text ist zu lang):

Compiling library "Ethernet"
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src" "-IC:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src" "C:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src\\Dhcp.cpp" -o "C:\\Users\\Technik\\AppData\\Local\\Temp\\arduino_build_509125\\libraries\\Ethernet\\Dhcp.cpp.o"
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src" "-IC:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src" "C:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src\\Dns.cpp" -o "C:\\Users\\Technik\\AppData\\Local\\Temp\\arduino_build_509125\\libraries\\Ethernet\\Dns.cpp.o"
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src" "-IC:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src" "C:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src\\EthernetServer.cpp" -o "C:\\Users\\Technik\\AppData\\Local\\Temp\\arduino_build_509125\\libraries\\Ethernet\\EthernetServer.cpp.o"
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src" "-IC:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src" "C:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src\\Ethernet.cpp" -o "C:\\Users\\Technik\\AppData\\Local\\Temp\\arduino_build_509125\\libraries\\Ethernet\\Ethernet.cpp.o"
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src" "-IC:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src" "C:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src\\EthernetUdp.cpp" -o "C:\\Users\\Technik\\AppData\\Local\\Temp\\arduino_build_509125\\libraries\\Ethernet\\EthernetUdp.cpp.o"
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src" "-IC:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src" "C:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src\\EthernetClient.cpp" -o "C:\\Users\\Technik\\AppData\\Local\\Temp\\arduino_build_509125\\libraries\\Ethernet\\EthernetClient.cpp.o"
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src" "-IC:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src" "C:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src\\socket.cpp" -o "C:\\Users\\Technik\\AppData\\Local\\Temp\\arduino_build_509125\\libraries\\Ethernet\\socket.cpp.o"
In file included from C:\Program Files (x86)\Arduino\libraries\Ethernet\src\Dns.cpp:8:0:
C:\Program Files (x86)\Arduino\libraries\Ethernet\src\Dns.cpp: In member function 'uint16_t DNSClient::BuildRequest(const char*)':
C:\Program Files (x86)\Arduino\libraries\Ethernet\src\utility/w5100.h:457:25: warning: result of '(256 << 8)' requires 18 bits to represent, but 'int' only has 16 bits [-Wshift-overflow=]
 #define htons(x) ( (((x)<<8)&0xFF00) | (((x)>>8)&0xFF) )
                      ~~~^~~
C:\Program Files (x86)\Arduino\libraries\Ethernet\src\Dns.cpp:164:18: note: in expansion of macro 'htons'
  twoByteBuffer = htons(QUERY_FLAG | OPCODE_STANDARD_QUERY | RECURSION_DESIRED_FLAG);
                  ^~~~~
"C:\\Program Files (x86)\\Arduino\\hardware\\tools\\avr/bin/avr-g++" -c -g -Os -Wall -Wextra -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10813 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\cores\\arduino" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\variants\\standard" "-IC:\\Program Files (x86)\\Arduino\\hardware\\arduino\\avr\\libraries\\SPI\\src" "-IC:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src" "C:\\Program Files (x86)\\Arduino\\libraries\\Ethernet\\src\\utility\\w5100.cpp" -o "C:\\Users\\Technik\\AppData\\Local\\Temp\\arduino_build_509125\\libraries\\Ethernet\\utility\\w5100.cpp.o"

Das ist der Teil in dem er die Ethernet Library kompiliert. Der Rest läuft fehlerfrei.

Ich hab das ganze auch nochmal mit einem anderen PC versucht und habe das selbe Problem.

jjw2202:
Ich benutze einen originalen Arduino Uno SMD R3 auf dem ein originales Arduino Ethernet Shield 2 sitzt.

#include <SPI.h>

#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress server(10,1,22,30);

IPAddress ip(10, 1, 22, 77);
IPAddress myDns(10, 1, 22, 1);

EthernetClient client;

unsigned long beginMicros, endMicros;
unsigned long byteCount = 0;
bool printWebData = true;

void setup() {
  Serial.begin(9600);
  while (!Serial) {
    ;
  }

Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");

if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
      while (true) {
        delay(1);
      }
    }
    if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }

Ethernet.begin(mac, ip, myDns);
  } else {
    Serial.print("  DHCP assigned IP ");
    Serial.println(Ethernet.localIP());
  }

delay(1000);
  Serial.print("connecting to ");
  Serial.print(server);
  Serial.println("...");

if (client.connect(server, 9990)) {
    Serial.print("connected to ");
    Serial.println(client.remoteIP());
  } else {
    Serial.println("connection failed");
  }
  beginMicros = micros();
}

Da ist doch das SD-Modul noch mit drauf...

Schreib mal im setup in die ersten Zeilen - gleich unter Serial.begin(9600):

  // Wenn Ethernetshield mit SD-Slot und der nicht genutzt:
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);

Ja da ist ein SD-Modul drauf.

Aber auch das ändert nichts...

jjw2202:
Aber auch das ändert nichts...

Dann muss ich auch aufgeben.
Ich habe soeben gebaut:
Original ARDUINO UNO - ein reines W5500 Modul.
Den Sketch vom delay() befreit auf den ARDUINO UNO geschoben und gewartet was passiert.
Dann das Kabel gekappt und reste gedrückt zur Gegenprobe.

Ausgabe:

19:05:02.645 -> Initialize Ethernet:
19:05:03.209 -> assigned IP: 10.1.22.77
19:05:03.209 -> connecting to 10.1.22.30...
19:05:04.203 -> connection failed
19:05:04.236 -> 
19:05:04.236 -> disconnecting.
19:05:04.236 -> Received 0 bytes in 0.0000, rate = 0.00 kbytes/second
19:05:39.624 -> Initialize Ethernet:
19:05:40.188 -> Ethernet cable is not connected.
19:05:40.188 -> connecting to 10.1.22.30...
19:05:40.222 -> connection failed
19:05:40.222 -> 
19:05:40.222 -> disconnecting.
19:05:40.222 -> Received 0 bytes in 0.0029, rate = 0.00 kbytes/second

Jetzt bin ich auch überfragt...
Jedenfalls ist das Verhalten NICHT normal.
Fakt ist aber, das bei den Shields mit der SD-Karte drauf, diese entweder als erstes initialisiert werden muss oder aber vor dem aktivieren des Ethernet der PIN 4 HIGH sein muss.

Du kannst ja mal versuchen einen Code zu bauen, in dem Du die SD.lib mitnimmst.

Das heißt ja ich bin nicht der einzige bei dem es nicht funktioniert...

Ich werde es morgen nochmal mit SD Library versuchen (die brauche ich für mein weiteres Vorgehen sowieso). Und ich habe noch einen PC, auf dem Arduino noch nie installiert war. Mit dem versuche ich es auch nochmal mit ganz "frischem" Arduino.

Mir ist übrigens noch aufgefallen das es egal ist ob ich im setup() das delay vor oder nach Ethernet.begin mache...

Dir auf jeden Fall vielen vielen Dank für deine Geduld und Ratschläge!

Ich hatte bei der Kombination Mega 2560 und Ethernetshield mit W5100 und SD auch eine kleine Wartezeit von ca. 1-2 Sekunden vorm Start des Ethernet nötig, da der Mega schneller oben war und die W5100 noch nicht zwingend fertig mit ihrer Initialisierung war.
So lange war das aber nicht, auch der Zustand der SD war völlig egal.
Hat da die Weiterentwicklung was verschlimmbessert?
Die Ethernetshields brauchen etwas länger zur Initialisierung, aber so lange sollte es nicht sein.

Gruß Tommy

jjw2202:
Das heißt ja ich bin nicht der einzige bei dem es nicht funktioniert...

Zumindest, was den Einsatz des Shields angeht.
Das E2 ist etwas anders, als das was hier standardmäßig eingesetzt wird. (W5100 mit SD - bzw. W5500 blank)

Mit dem versuche ich es auch nochmal mit ganz "frischem" Arduino.

Mir ist übrigens noch aufgefallen das es egal ist ob ich im setup() das delay vor oder nach Ethernet.begin mache...

Das wird nichts bringen.
Es dürfte egal sein, auf welchem Grundsystem der Code kompiliert wird.
Das delay selbst sorgt definitiv dafür, das das shield bereit wird, bevor abgefragt.

Der Unterschied zwischen Dir und mir dürfte nur die Version der Arduino-IDE sein - ich benutz die 1.8.8 (Stand 2018) - das ethernet ist 2019 noch verändert worden...
Ich hab noch ne .12 Version an die ich ggfls. rankomme, da schau ich nochmal drauf...

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.