Problemas con esp8266 y arduino

Hola estoy intentando cargar un codigo que contiene un HTML en el arduino comunicado con comandos AT.
Este funciona , pero la pagina en el pc aunque sale entera se queda cargando constantemente, no termina la carga.Problema que no me deja hacer otras opciones bien como refrescar la pagina para otro fines.
El codigo en cuestion es este:

#include <SoftwareSerial.h>
SoftwareSerial ESP8266(2, 3); // RX | TX
#define DEBUG true
int x1=0;
void setup()
 { Serial.begin(9600);
 ESP8266.begin(9600);
 pinMode(13,OUTPUT);
 pinMode(12,OUTPUT);
 pinMode(11,OUTPUT);
 pinMode(10,OUTPUT);

 //EnvioDeDatos("AT+RST\r\n",2000,DEBUG); // resetea el  modulo
  EnvioDeDatos("AT+CWMODE=1\r\n",1000,DEBUG);                           // Cconfigura el modulo en Estación
  EnvioDeDatos("AT+CWJAP='ssid','pasword'\r\n",1000,DEBUG);     // datos de tu red.
  EnvioDeDatos("AT+CIFSR\r\n",1000,DEBUG);                              // Nos muestra nuestra Ip asignada.
  EnvioDeDatos("AT+CIPMUX=1\r\n",1000,DEBUG);                           // Configura multiples coneciones
  EnvioDeDatos("AT+CIPSERVER=1,80\r\n",1000,DEBUG);                     // Inicializa el servidor web
 }
void loop()
 { 
 while (ESP8266.available() >0 )                                        // se recibieron datos.
   {char c = ESP8266.read();                                              // lee los datos.
   Serial.print(c);                                                       // Los reenvia por el puerto hardware para que veamos que estamos recibiendo.
   if (c == 71)                                                           // Si recibe un GET al ver la primera letra incia la transmision de datos.
    {Serial.println("peticion recibida");                                 // No dice que ha recibido una peticion.
    delay(1000);
    codigoServidor();
 }
 }
 while(x1==1){
    if(ESP8266.find("+IPD,")){
      delay(500);
      int connectionId = ESP8266.read()-48; 
      ESP8266.find("pin=");
      int pinNumber = (ESP8266.read()-48)*10;
       pinNumber += (ESP8266.read()-48);
      digitalWrite(pinNumber, !digitalRead(pinNumber));
      Serial.print("Pulsado pin ");
      Serial.println(pinNumber);
       }
  }
 }
void codigoServidor(){
     escribir("<!DOCTYPE HTML>");
     escribir("<html>");                                                  //una pagina web necesita esto <HTML> y </HTML> es el inicio y fin del documento
     escribir("<head><title>botones arduino esp8266 html</title>");    //nombre de la pestaña que llevara la pagina
     escribir("<body><h1> <FONT SIZE=\"5\" COLOR=\"red\"> botones </h1>");                              //titulo del inicio de la pagina
     escribir(" <BODY BGCOLOR=\"black\"> ");  
    escribir("<input type=\"button\" onclick=\"location.href='http://192.168.1.133/pin=13' \" value=\"pin 13\" name=\"boton1\" style='width:100px; height:50px'/>");
     escribir("<input type=\"button\" onclick=\"location.href='http://192.168.1.133/pin=12' \" value=\"pin 12\" name=\"boton2\" style='width:100px; height:50px'/>");
     escribir("<input type=\"button\" onclick=\"location.href='http://192.168.1.133/pin=11' \" value=\"pin 11\" name=\"boton3\" style='width:100px; height:50px'/>");
     escribir("<input type=\"button\" onclick=\"location.href='http://192.168.1.133/pin=10' \" value=\"pin 10\" name=\"boton4\" style='width:100px; height:50px'/>");
     escribir("<DIV align=\"center\"><A HREF=\"http://www.hetpro.com\" target=\"_blank\">hetpro.com</a>
</DIV>");
     escribir("</html>");
x1=1;
    }
void escribir(String text)
{ESP8266.print("AT+CIPSEND=0,"); 
 ESP8266.println(text.length());
 if (ESP8266.find(">")){ // Si se recibe el mensaje
 {Serial.println(text);
 ESP8266.println(text); //mandamos el mensaje por el wifi 
 delay(1);}
 while ( ESP8266.available() > 0 ) 
 {
  if ( ESP8266.find("SEND OK") ){ //buscamos "ok" y luego salimos
DEBUG; }
 }
 }
}
String EnvioDeDatos(String command, const int timeout, boolean debug)
{
    String cadena = "";
    ESP8266.print(command); // enviar el carácter leído al modulo
    long int time = millis();
    while( (time+timeout) > millis())
    {
      while(ESP8266.available())
      {
        // Muestra los Datos de salida del modulo por el seguimiento de la serie
        char c = ESP8266.read(); //Lee el proximo caracter
        cadena+=c;
      }  
    }
    
    if(debug)
    {
      Serial.print(cadena);
    }
    
    return cadena;
}

El error esta seguro en el codigo.
Pues si meto este mas sencillo va perfecto y carga por completo.

#include <SoftwareSerial.h>
 // arduino Rx (pin 2) ---- ESP8266 Tx
 // arduino Tx (pin 3) ---- ESP8266 Rx
SoftwareSerial esp8266(2,3); 
void setup()
{
 Serial.begin(9600);  // monitor serial del arduino
 esp8266.begin(9600); // baud rate del ESP8255
 
 pinMode(13,OUTPUT);
 digitalWrite(13,LOW);
 
 sendData("AT+RST\r\n",2000);      // resetear módulo
 sendData("AT+CWMODE=1\r\n",1000); // configurar como cliente
 sendData("AT+CWJAP=\"ssid\",\"pasword\"\r\n",8000); //SSID y contraseña para unirse a red 
 sendData("AT+CIFSR\r\n",1000);    // obtener dirección IP
 sendData("AT+CIPMUX=1\r\n",1000); // configurar para multiples conexiones
 sendData("AT+CIPSERVER=1,80\r\n",1000);         // servidor en el puerto 80
}
void loop()
{
 if(esp8266.available())   // revisar si hay mensaje del ESP8266
 {
 if(esp8266.find("+IPD,")) // revisar si el servidor recibio datos
 {
 delay(1500); // esperar que lleguen los datos hacia el buffer
 int conexionID = esp8266.read()-48; // obtener el ID de la conexión para poder responder
 esp8266.find("led="); // bucar el texto "led="
 int state = (esp8266.read()-48); // Obtener el estado del pin a mostrar
 digitalWrite(13, state); // Cambiar estado del pin
while(esp8266.available()){
 char c = esp8266.read();
 Serial.print(c);
 }
 
 //responder y cerrar la conexión para que el navegador no se quede cargando 
 // página web a enviar
 String webpage = "";
 
    
 if (state==1) webpage += "<h1>LED_13 = encendido!</h1>";
 else { webpage += "<h1>LED_13 = apagado!</h1>";}
 
 // comando para enviar página web
 String comandoWebpage = "AT+CIPSEND=";
 comandoWebpage+=conexionID;
 comandoWebpage+=",";
 comandoWebpage+=webpage.length();
 comandoWebpage+="\r\n";
 sendData(comandoWebpage,1000);
 sendData(webpage,1000);
 
 // comando para terminar conexión
 String comandoCerrar = "AT+CIPCLOSE=";
 comandoCerrar+=conexionID;
 comandoCerrar+="\r\n";
 sendData(comandoCerrar,3000);
 }
 }
}
/*
Enviar comando al esp8266 y verificar la respuesta del módulo, todo esto dentro del tiempo timeout
*/
void sendData(String comando, const int timeout)
{
 long int time = millis(); // medir el tiempo actual para verificar timeout
 
 esp8266.print(comando); // enviar el comando al ESP8266
 
 while( (time+timeout) > millis()) //mientras no haya timeout
 {
 while(esp8266.available()) //mientras haya datos por leer
 { 
 // Leer los datos disponibles
 char c = esp8266.read(); // leer el siguiente caracter
 Serial.print(c);
 }
 } 
 return;
}]

Lo que ocurre que al ser un poco diferentes no soy capaz de ver donde fallo.
Gracias de antemano.
Un Saludo a todos.

Tu còdigo lo dice claramente

while (ESP8266.available() >0 )

se queda esperando porque asi lo programaste, mientras haya caracteres me quedo en el while.

Y en el que llamas mas sencillo no apreciaste esto

if(esp8266.available())   // revisar si hay mensaje del ESP8266

Aca solo hace algo con 1 caracter que se lee y depende de como manejes la trama dentro o cual es el caracter que indica fin de trama.
En eso reside que algo se quede esperando o salga.
Ademas ponerle un timeout como he visto tmb es buena idea.