UPDATE:
oltre alle cose precedenti, intanto ho comunque voluto vedere nella libreria quand'è che compare quel messaggio e cosa significa quel numero.
In EspDrv.cpp il metodo getData è:
...
bool EspDrv::getData(uint8_t connId, uint8_t *data, bool peek, bool* connClose)
{
if (connId!=_connId)
return false;
// see Serial.timedRead
long _startMillis = millis();
do
{
if (espSerial->available())
{
if (peek)
{
*data = (char)espSerial->peek();
}
else
{
*data = (char)espSerial->read();
_bufPos--;
}
//Serial.print((char)*data);
if (_bufPos == 0)
{
// after the data packet a ",CLOSED" string may be received
// this means that the socket is now closed
delay(5);
if (espSerial->available())
{
//LOGDEBUG(".2");
//LOGDEBUG(espSerial->peek());
// 48 = '0'
if (espSerial->peek()==48+connId)
{
int idx = readUntil(500, ",CLOSED\r\n", false);
if(idx!=NUMESPTAGS)
{
LOGERROR(F("Tag CLOSED not found"));
}
LOGDEBUG();
LOGDEBUG(F("Connection closed"));
*connClose=true;
}
}
}
return true;
}
} while(millis() - _startMillis < 2000);
// timed out, reset the buffer
LOGERROR1(F("TIMEOUT:"), _bufPos);
_bufPos = 0;
_connId = 0;
*data = 0;
return false;
}
Nota la parte alla fine del metodo: mi pare ovvio quindi per prima cosa che i 2 secondi di timeout siano "scolpiti" nel codice, e poi che il numero che compare dopo "TIMEOUT" è quindi il numero di caratteri ancora nel buffer interno mentre la connessione è ancora attiva.
Questo però potrebbe significare che non hai ricevuto/riconosciuto la stringa che consideri come terminatore, e dopo 2 secondi va (giustamente) in TIMEOUT.
A questo punto quindi per prima cosa la mia domanda è: ma quando accade questo, comunque tu la risposta sul client l'hai ricevuta o (come penso) non ha affatto risposto con l'output dei dati?
Se così fosse, dovremmo/dovresti chiederci/chiederti perché ci siano ancora più di 300 byte nel buffer interno quando va in timeout, ovvero perché non ricevi o non "riconosci" la sequenza terminale della request, ossia una riga a vuoto ("\r\n\r\n").
Intanto comunque prova quanto ti ho scritto nel precedente (la scrittura di debug dei millis e dei caratteri ricevuti) e dicci cosa succede. Poi prova ad alzare quel "2000" scolpito nel codice, portalo a 5000, e ripeti la compilazione e test di prima.
EDIT: comunque leggendo la tua lunghissima loop() inizio a temere che dato che fai "tante" cose nel resto del loop(), soprattutto se ci sono vari delay(), quando cicla all'inizio del loop() c'è il rischio che siano già stati ricevuti vari caratteri e quindi saturato il buffer interno del WiFiEsp che quindi non "vede" i caratteri finali "\r\n\r\n" della linea vuota.
Secondo me dovresti cercare di leggere più rapidamente possibile nel tuo buffer circolare ossia mettere dentro ad una funzione almeno la porzione di codice che legge dal client, e richiamarla più spesso all'interno della loop(), mentre lasciare all'inizio solamente il controllo della linea vuota ricevuta.
Oppure per qualche ragione potresti aver ricevuto altri caratteri dopo la linea vuota, per cui "endsWith" dà sempre false.
Fai un po' di esperimenti anche in questo senso, insieme alle cose che ho scritto sopra e facci sapere.