Problema ricezione seriale arduino/esp8266...

Ciao a tutti, sto uscendo pazzo con un problema banale.
La situazione è questa: ESP8266 collegato ad arduino tramite SoftwareSerial.
Arduino dovrebbe interrogare una pagina PHP in un server ma...
Finche si tratta di ricevere pochi byte con il modulo ESP8266 non ci sono problemi, ma quando ne ricevo una manciata in più (intendo da 20/30 bytes a 200bytes) tra ESP8266 e seriale succede il finimondo.

Tralasciando il fatto che il codice è scritto con i piedi (ma mi serve solo per testare questa cosa), voi vedete qualcosa di strano?

Questo è lo sketch

#include <SoftwareSerial.h>

SoftwareSerial eb(5, 6);

void setup()
{
  Serial.begin(4800);
  while (!Serial);
  
  Serial.println("Start");
  
  eb.begin(4800);
  eb.write("AT+RST\r\n");
  delay(1000);

  a();

  eb.write("ATE1\r\n");
  delay(1000);

  a();
 
  eb.write("AT+CIPMODE=0\r\n");
  delay(1000); 

  a();

  eb.write("AT+CWMODE=1\r\n");
  delay(1000); 

  a();

  eb.write("AT+CIPMUX=1\r\n");
  delay(1000); 

  a();

  eb.write("AT+CWJAP=\"myAP\",\"myPassword\"\r\n");
  delay(10000); 

  a();

  eb.write("AT+CIPSERVER=1,1745\r\n");
  delay(1000); 

  a();

  eb.write("AT+CIPSTART=0,\"UDP\",\"0.0.0.0\",2512,2512,2\r\n");
  delay(1000); 

  a();

  String cmd;
  String cmd1;
  
  eb.write("AT+CIPSTART=1,\"TCP\",\"192.168.0.1\",80\r\n");
  delay(1000);

  a();

  cmd = "GET /p.php?marca=fiat&modello=panda HTTP/1.0\r\n";
  cmd1 ="Host: 192.168.0.1\r\n\r\n";
  
  eb.write("AT+CIPSEND=1,");
  eb.print(String(cmd.length()));
  eb.write("\r\n");
  delay(1000);

  a();
  
  eb.print(cmd);
  delay(1000);

  a();
  
  eb.write("AT+CIPSEND=1,");
  eb.print(String(cmd1.length()));
  eb.print("\r\n");
  delay(1000);

  a();  
  
  eb.print(cmd1);
  delay(1000);
  
  a();

  eb.println("fine");
}



void loop()
{
  //while(eb.available()) Serial.print((char)eb.read());
    
}


void a(void)
{
    while(!eb.available());


    while(eb.available()) Serial.print((char)eb.read());


}

Questo è quello che riceve arduino sulla softwareserial:

Start
AT+RST


OK
WIFI DISCONNECT
a`⸮!⸮aF⸮⸮B9⸮%⸮4⸮⸮⸮⸮⸮
Ai-ThiATE1


OK
AT+CIPMODE=0


OK
AT+CWMODE=1


OK
WIFI CONNECTED
AT+CIPMUX=1


OK
WIFI GOT IP
AT+CWJAP="myAP","myPassword"

WIFI DISCONNECTAT+CIPSERVER=1,1745


OK
AT+CIPSTART=0,"UDP","0.0.0.0",2512,2512,2

0,CONNECT

OK
AT+CIPSTART=1,"TCP","192.168.0.1",80

1,CONNECT

OK
AT+CIPSEND=1,46


OK
> 
Recv 46 bytes

SEND OK
AT+CIPSEND=1,21


OK
> 
Recv 21 bytes

SEND OK

+IPD,1,202:HTTP/1.1 200 OK  
Date:                                        <==== QUI IL PACCHETTO VIENE TRONCATO

e questo è quello che in realtà riceve il modulo ESP (cioè tutto quello che deve ricevere)

AT+RST                                                                          
                                                                                
OK                                                                              
WIFI DISCONNECT                                                                 
{�'�N�^b��                                                                     
Ai-Thinker Technology Co. Ltd.                                                  
                                                                                
invalid                                                                         
ATE1                                                                            
                                                                                
OK                                                                              
AT+CIPMODE=0                                                                    
                                                                                
OK                                                                              
AT+CWMODE=1                                                                     
                                                                                
OK                                                                              
WIFI CONNECTED                                                                  
AT+CIPMUX=1                                                                     
                                                                                
OK                                                                              
WIFI GOT IP                                                                     
AT+CWJAP="myAP","myPassword"                                   
WIFI DISCONNECT                                                                 
WIFI CONNECTED                                                                  
WIFI GOT IP                                                                     
                                                                                
OK                                                                              
AT+CIPSERVER=1,1745                                                             
                                                                                
OK                                                                              
AT+CIPSTART=0,"UDP","0.0.0.0",2512,2512,2                                       
0,CONNECT                                                                       
                                                                                
OK                                                                              
AT+CIPSTART=1,"TCP","192.168.0.1",80                                            
1,CONNECT                                                                       
                                                                                
OK                                                                              
AT+CIPSEND=1,46                                                                 
                                                                                
OK                                                                              
>                                                                               
Recv 46 bytes                                                                   
                                                                                
SEND OK                                                                         
AT+CIPSEND=1,21                                                                 
                                                                                
OK                                                                              
>                                                                               
Recv 21 bytes                                                                   
                                                                                
SEND OK                                                                         
                                                                                
+IPD,1,202:HTTP/1.1 200 OK                                                      
Date: Wed, 18 Oct 2017 18:49:57 GMT                                             
Server: Apache/2.4.25 (Raspbian)                                                
Content-Length: 33                                                              
Connection: close                                                               
Content-Type: text/html; charset=UTF-8                                          
                                                                                
Hai scelto una fiat modello panda1,CLOSED                                       
fine                                                                            
ERROR

Come potete vedere, sniffando quello che viene ricevuto e trasmesso ad arduino dal modulo esp8266 si vede bene che la risposta dal server web arriva completa, mentre su arduino solo pochi byte.
Ho fatto un sacco di prove (tra cui alzare ed abbassare il baudrate tra esp ed arduino) ma non riesco a venirne fuori :confused:
Qualche consiglio?
Grazie.

Stefano

Prova ad aumentare un po' il buffer della seriale:

For SoftwareSerial modify _SS_MAX_RX_BUFF in
Arduino\hardware\arduino\avr\libraries\SoftwareSerial\SoftwareSerial.h

E usa 9600 bps.

Volevo fare questa prova (che ora comunque faccio), ma girovagando sulla rete in cerca del problema ho letto che se SoftwareSerial.available() restituisce 128 vuol dire che c'è un buffer overflow.
Tra le varie prove ho monitorato anche il valore di ritorno di SoftwareSerial.available() ma non ha mai restituito 128.
Comunque ora provo ad aumentare il buffer e incrociamo le dita :slight_smile:
Intanto grazie della dritta.

Stefano

Niente da fare, ho riconfigurato il modulo a 9600 e aumentato il buffer di SoftwareSerial ma non legge nemmeno mezzo byte in più rispetto a prima.
Ho prima provato a portare il buffer da 64 a 128 e poi visto che non cambiava nulla ho fatto una prova estrema portandolo a 512, ma quello che riceve della risposta del server web è sempre lo stesso :frowning:
Ci ho perso 3 ore a fare prove ma non ne sono venuto fuori e non so più dove sbattere la testa.
L'unico dubbio che mi viene è che il problema non dipenda dal fatto che il server web chiude la connessione prima che tutti i byte ricevuti nel buffer vengano trasferiti tramite seriale e il firmware dell'esp quando trova una connessione chiusa azzera il buffer.
Sto ragionando su ipotesi assurde perchè non so più dove aggrapparmi.

Stefano