Descargar unos 60 kb desde servidor web a SD de arduino

Hola amigos,

Estoy intentando descargar unos 60 kb desde un servidor web (webservices) a la SD de arduino. El código es el que pongo más abajo; el problema es que no se descarga todo el contenido, se corta en aproximadamente 2 kb, aunque en ocasiones si lo ha descargado completo. He cambiado el tiempo de espera de delay() desde 300 hasta 10000, con idénticos resultados. ¿Alguna ayuda? GRACIAS.

void descargaDatos( unsigned long idZona ){

	String q;
	File Archivo;
	String cad;
	char c;
	int filas=0;
	EthernetClient cliente;

	wdt_disable();  

	q="GET /webservices/wdsjson.php?d=0&c=Descarga&i=DWL&z="+String(idZona);

#ifdef DEBUG
    Serial.println("Proceso .: descargaDatos.");
        Serial.println("Estado ..: conectando.");
#endif

	if (cliente.connect(placa.servidor, 80)>0) {

	    if ( SD.exists( "cbrcdw.csv" ) ){
	      SD.remove( "cbrcdw.csv" );
	    }

		Archivo = SD.open("cbrcdw.csv", FILE_WRITE);

		// Limpiar el buffer antes de comenzar el proceso
//		cliente.flush();

#ifdef DEBUG
    Serial.println("Estado ..: conectado con el servidor.");
    Serial.println("Estado ..: enviando petición.");
	Serial.print("Petición : ");
	Serial.println(q);
#endif
		cliente.println(q);
		cliente.println(" HTTP/1.0");
		cliente.println("User-Agent: Arduino 1.0");
		cliente.println();

	    Serial.println("Estado ..: esperando datos desde el servidor.");

		delay(1000);

		Serial.print("Bytes a leer: ");
		Serial.println(cliente.available());

		do{
			c = cliente.read();
			Serial.print(c);
			Archivo.print(c);
			if (c==10){
				Serial.println();
				filas++;
			}
		}while(cliente.available());

		Archivo.close();

	} else {
#ifdef DEBUG  	
    Serial.println("Estado ..: ERROR - conexión con servidor ha fallado.");
#endif
	}  

	if (!cliente.connected()) {
#ifdef DEBUG  	
		Serial.println();
		Serial.println("Desconectando.");
#endif    
		cliente.stop();
		cliente.flush();
	}

	q="";
	cad="";

#ifdef DEBUG  	
		Serial.println();
		Serial.print("Proceso terminado. Filas: ");
		Serial.println(filas);
#endif    

	cliente:~EthernetClient();

	wdt_enable(WDTO_8S);

}

He comprobado el log del servidor web y recibe la trama, ejecuta el proceso y devuelve el resultado.

La misma trama enviada desde el navegador web si recibe todos los datos.

Saludos y gracias.

Intuyo que lo que podría estar pasando es que dejas de leer tras finalizar un paquete de datos. Deberías combinar cliente.available() con algún control de timeout. Vamos, que no salga del bucle de recepción simplemente porque no haya caracteres disponibles, sino porque pase x tiempo sin haber caracteres disponibles.

Hola

Gracias por responder.

No creo que esa sea la mejor solución.

Saludos

no te olvides que los paquetes se fragmentan, puede haber una demora o en la escritura a tu sd o en la llegada del paquete.
Deberias primero saber cuanto va a llegar y esperar un tiempo prudencial para saber si llegó todo.
Es mejor por UDP donde puede tener un protocolo con ACK de cada bloque y retransmitir si no llega.

jalfonsosuarez:
Hola

Gracias por responder.

No creo que esa sea la mejor solución.

Saludos

Prueba con este bucle de recepción. No tienes nada que perder.

      do{
            Serial.print("Bytes a leer: ");
            Serial.println(cliente.available());
            while(cliente.available()) {
                  c = cliente.read();
                  Serial.print(c);
                  Archivo.print(c);
                  if (c==10){
                        Serial.println();
                        filas++;
             }
            delay(500);
      }  while (cliente.available());