Ethernet shield hangs

I'm sorry. Here my code:

#include <SPI.h>
#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFF, 0xED};
String code = "";
String doc = "";
String data;
int lencode;


IPAddress server(192,168,1,15);

EthernetClient client;


void setup() {
  //set pinmode to control 10 relay
  pinMode(0, OUTPUT);
  pinMode(1, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(9, OUTPUT);
  // turn - off 10 realy
  digitalWrite(0, LOW); 
  digitalWrite(1, LOW); 
  digitalWrite(2, LOW); 
  digitalWrite(3, LOW); 
  digitalWrite(4, LOW); 
  digitalWrite(5, LOW);
  digitalWrite(6, LOW); 
  digitalWrite(7, LOW); 
  digitalWrite(8, LOW); 
  digitalWrite(9, LOW);
   
 // Ethernet.begin(mac, ip, mydns, gateway, subnet);
  Ethernet.begin(mac);
  if (Ethernet.begin(mac) == 0 )
       {
           Ethernet.maintain();          
       }
  delay(50);
  client.connect(server,1000);
  delay(200);
  while(!client.connected()){
    delay(50);
    client.stop();
    delay(50);
    client.connect(server, 1000);
    delay(200);
  }
  if (client.connected()) {
    client.print("relay already");
  }
}

void(*resetFunc) (void) = 0;

void loop()
{ 
  //get string command from server
  if (client.available()) {
    code = "";
    while (client.available() > 0) {
      char c = client.read();
      code += c;
    }
  }

 if ( code.startsWith("relay")) {
    command();
  }    

 //auto re-connect when internet problem
  while(!client.connected()){
      client.stop();
      delay(50);
      //try 10 times
      for(int i = 0; i<10;i++){
        delay(3000);
     
       client.connect(server, 1000);
        delay(50);
        if(client.connected()){         
          client.print("re-connect control relay");    
          return;
        }      
      }
      //after 10 times still not re-connect. Call resetFunc goto void(setup)
      digitalWrite(0, LOW); 
      digitalWrite(1, LOW); 
      digitalWrite(2, LOW); 
      digitalWrite(3, LOW); 
      digitalWrite(4, LOW); 
      digitalWrite(5, LOW);
      digitalWrite(6, LOW); 
      digitalWrite(7, LOW); 
      digitalWrite(8, LOW); 
      digitalWrite(9, LOW);
      resetFunc();
     }
}

void command()
{
  //PIN 0 :
  if( code.endsWith("OUT00")){
    digitalWrite(0,LOW);
    delay(20);
    code = "";
  }
  if( code.endsWith("OUT01")){
    digitalWrite(0,HIGH);
    delay(20);
    code = "";
  }
  //PIN 1 :
  if( code.endsWith("OUT10")){
    digitalWrite(1,LOW);
    delay(20);
    code = "";
  }
  if( code.endsWith("OUT11")){
    digitalWrite(1,HIGH);
    delay(20);
    code = "";
  }
  //PIN 2:
  if( code.endsWith("OUT20")){
    digitalWrite(2,LOW);
    delay(20);
    code = "";
  }
  if( code.endsWith("OUT21")){
    digitalWrite(2,HIGH);
    delay(20);
    code = "";
  }
 //PIN 3:
  if( code.endsWith("OUT30")){
    digitalWrite(3,LOW);
    delay(20);
    code = "";
  }
  if( code.endsWith("OUT31")){
    digitalWrite(3,HIGH);
    delay(20);
    code = "";
  }
  //PIN 4:
  if( code.endsWith("OUT40")){
    digitalWrite(4,LOW);
    delay(20);
    code = "";
  }
  if( code.endsWith("OUT41")){
    digitalWrite(4,HIGH);
    delay(20);
    code = "";
  }
  //PIN 5:
  if( code.endsWith("OUT50")){
    digitalWrite(5,LOW);
    delay(20);
    code = "";
  }
  if( code.endsWith("OUT51")){
    digitalWrite(5,HIGH);
    delay(20);
    code = "";
  }
  //PIN 6:
  if( code.endsWith("OUT60")){
    digitalWrite(6,LOW);
    delay(20);
    code = "";
  }
  if( code.endsWith("OUT61")){
    digitalWrite(6,HIGH);
    delay(20);
    code = "";
  }
  //PIN 7:
  if( code.endsWith("OUT70")){
    digitalWrite(7,LOW);
    delay(20);
    code = "";
  }
  if( code.endsWith("OUT71")){
    digitalWrite(7,HIGH);
    delay(20);
    code = "";
  }
  //PIN 8:
  if( code.endsWith("OUT80")){
    digitalWrite(8,LOW);
    delay(20);
    code = "";
  }
  if( code.endsWith("OUT81")){
    digitalWrite(8,HIGH);
    delay(20);
    code = "";
  }
  //PIN 9:
  if( code.endsWith("OUT90")){
    digitalWrite(9,LOW);
    code = "";
  }
  if( code.endsWith("OUT91")){
    digitalWrite(9,HIGH);
    delay(20);
    code = "";
  }
}

My code is fine. It is working.
Ex: I send string command from virtual TCPserver to Arduino, I will turn on/off relay

  • relayOUT00 : turn - off relay 1
  • relayOUT01 : turn - on relay 1
    and so on.

The problem is Ethernet Shield go to Watchdog or timeout/hang. I can not control after 15min.
I modified follow your code in library w5100.cpp. I set 0 and 1. But it did not work.

void W5100Class::init(void)
{
  delay(300);

#if !defined(SPI_HAS_EXTENDED_CS_PIN_HANDLING)
  SPI.begin();
  initSS();
#else
  SPI.begin(SPI_CS);
  // Set clock to 4Mhz (W5100 should support up to about 14Mhz)
  SPI.setClockDivider(SPI_CS, 21);
  SPI.setDataMode(SPI_CS, SPI_MODE0);
#endif
  SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
  writeMR(1<<RST);
  writeTMSR(0x55);
  writeRMSR(0x55);
  SPI.endTransaction();

  [b]writeRCR(0x00);[/b]
 
  for (int i=0; i<MAX_SOCK_NUM; i++) {
    SBASE[i] = TXBUF_BASE + SSIZE * i;
    RBASE[i] = RXBUF_BASE + RSIZE * i;
  }
}

Thank SurferTim for your consider