Mega + Ethernet-Shield (W5100): Probleme als WebServer

Hi, da mein aktuell programmierter Webserver nur "leidlich" läuft, habe ich einmal das WebServer Programm aus den Beispielen verwendet. Ich habe nur die Zeile mit dem Refresh entfernt, da ich die Seite nur einmal anfragen und empfangen will, um die Probleme besser eingrenzen zu können.

Hier sieht es allerdings auch nicht wirklich besser aus. Nach dem Neustart des Aruino zeigt er mir, dass der Webserver unter der programmierten IP gestartet wird. Wenn ich anschliessend aus dem Browser meines PCs die Seite aufrufe, dann klappt das beim ersten Mal. Die 6 Zeilen mit den Werten der Analogeingängen werden im Browser dargestellt, und in der seriellen Konsole des Arduinos kommt auch das erwartete:

new client
GET / HTTP/1.1
Host: 192.168.1.91
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:26.0) Gecko/20100101 Firefox/26.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
Cache-Control: max-age=0

client disonnected

Wenn ich dann anschliessend die Seite einige Male neu lade (so im 3 Sekunden Rhythmus), dann kommt es ziemlich bald zu den Problemen. Die Seite wird nicht wieder aufgebaut, im Browser dreht die Sanduhr und der Arduino bringt auch nichts in der seriellen Konsole Nach einiger Zeit (20-30 sek) wird die Seite dann doch aufgebaut und in der seriellen Konsole kommen auch die o.g. Zeilen. In dieser "Wartezeit" sendet der PC immer wieder TCP-Retransmission Telegramme (lt. Wireshark)

Sieht so aus, als ob sich der Arduino oder das WIZnet-Shield irgendwie aufhängen. - Um einen Hardwaredefekt auszuschliessen hab ich den Mega gegen einen UNO getauscht. Selbes Problem. - Ethernet-Shield hab ich leider kein Zweites zum Testen hier :-( - Und ich hab auch schon 3 verschiedene PCs probiert, um hier was auszuschliessen.

Ist das ein generelles Problem, das ich hier habe? Läuft bei euch ein ähnlicher Webserver stabil?

Edit: Das Problem liegt eigentlich schon bei der server.available Abfrage:

  // listen for incoming clients
  EthernetClient client = server.available();
   if (client) {
    Serial.println("new client");

In der "Wartezeit" kommt von server.available() eine NULL zurück. Sieht doch dann so aus, als ob vom Ethernet-Shield keine eingehenden Daten erkannt werden??? Aber lt. Wireshark werden laufend Telegramme an das Ethernet-Shield gesendet.

Kannst Du bitte mal den Code posten, den Du verwendest?

Hi,
sorry, hast natürlich recht. Dachte nur, weil es das “offiziele” Beispiel aus der Arduino IDE ist.

/*
  Web Server
 
 A simple web server that shows the value of the analog input pins.
 using an Arduino Wiznet Ethernet shield. 
 
 Circuit:
 * Ethernet shield attached to pins 10, 11, 12, 13
 * Analog inputs attached to pins A0 through A5 (optional)
 
 created 18 Dec 2009
 by David A. Mellis
 modified 9 Apr 2012
 by Tom Igoe
 
 */

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

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,91);

// Initialize the Ethernet server library
// with the IP address and port you want to use 
// (port 80 is default for HTTP):
EthernetServer server(80);

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
   if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
//	  client.println("Refresh: 5");  // refresh the page automatically every 5 sec
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          // output the value of each analog input pin
          for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
            int sensorReading = analogRead(analogChannel);
            server.print("analog input ");
            client.print(analogChannel);
            client.print(" is ");
            client.print(sensorReading);
            client.println("
");       
          }
          client.println("</html>");
          break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        } 
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(100);
    Serial.println("now 100ms delay");    
    // close the connection:
     client.stop();
     Serial.println("client disconnected");
  }
}

Hi,

ich glaub ich habs gefunden. :) :) :) Zumindest hab ich jetzt so 30 mal aus dem Browser angesteuert, und es war immer OK.

Das Problem war eine doppelte MAC-Adresse. Ich hab schon einen Arduino mit Ethernet-Shield im Hausnetz. Zum Auslesen des Stromzählers. Da ich diese Software auch auf ein Beispiel aus der Arduino Bibliothek aufgebaut habe, hatte der natürlich die selbe MAC-Adresse. Daran hab ich Esel nicht gedacht. Man oh man: 281.474.976.710.656 verschiedene MAC-Adressen kann man einstellen. Und ich schaffs doch wirklich zwei mal dieselbe zu nehmen. =(

Muss man erst mal drauf kommen. Bei der IP, da führ ich über alle Geräte bei mir im Hausnetzwerk peinlichst Buch, damit ich da keine Überschneidungen habe, aber die MAC-Adresse hab ich nie beachtet, da ja jedes Gerät eine einzigartige hat, oder zumindest haben sollte. Der Arduino ist halt das einzige Gerät, bei dem man sie manuell vergibt.

Ich hoffe das war auch wirklich das Problem. Deutet aber alles drauf hin.