Go Down

Topic: ESP8266 - Problema ricezione dati con SoftwareSerial [Risolto] (Read 173 times) previous topic - next topic

Il_Palmi

Ciao a tutti. Chiedo aiuto perché è da qualche giorno che ci sbatto la testa e non riesco a venirne a capo. So cercando di utilizzare questo modulo wifi: https://www.elecrow.com/wiki/index.php?title=Crowtail-_Serial_Wifi.

Si tratta di un modulo ESP8266 e cercando online non ho trovato nessuno che riesca a risolvere il problema. In sostanza, se collego il modulo ai pin 0 e 1 di un arduino UNO, riesco ad interfacciarmi molto bene e senza errori con il modulo tramite il monitor seriale. Utilizzando invece la libreria "SoftwareSerial" e i pin 2 e 3, la prima parte del testo la ricevo correttamente mentre il resto arriva corrotto e incompleto. Ho settato il baud rate del modulo a 9600 sapendo che questa libreria non supporta le velocità superiori, ma non risolve il problema. Voglio utilizzare questo secondo metodo per far sì che sia arduino a gestire il modulo wifi in automatico. Non voglio utilizzare le porte 0 e 1.

Allego codice e screenshot del monitor seriale.

Grazie in anticipo per l'aiuto.

Code: [Select]
#include <SoftwareSerial.h>

#define DEBUG true

SoftwareSerial esp(3,2);

void setup() {
  Serial.begin(115200);
  esp.begin(9600);
  pinMode(3,INPUT);
  pinMode(2,OUTPUT);
  init_esp();

}

void loop() {
}

void init_esp(){
  sendData("AT+CWMODE=1\r\n", 1000, DEBUG);
  sendData("AT+CWLAP\r\n", 10000, DEBUG);
}

void sendData(String command, const int timeout, boolean debug){    
  String response = "";
  esp.print(command); // send the read character to the esp8266
  long int time = millis();
  char ch;
  while ( (time + timeout) > millis()) {
    while (esp.available()) {
      ch = esp.read();
      response += ch;
    }
  }
  if (debug) {
    Serial.print(response);
  }
  return response;
}

steve-cr

Benvenuto !

essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :)


P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell'apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. ;)
Samantha Cristoforetti: "Mi fai fare un giro sul tuo ultraleggero?". "Certamente, però piloto io !"

Standardoil

Io non so dove tu sia andato a trovare il codice che hai postato, ma buttalo via...
Riscrivilo senza usare oggetti Stringa e senza restituire qualcosa in una funzione void, e senza inizializzare i piedini 2 e 3, ci pensa la libreria
Io ho trovato giovamento nel tenere le velocità delle due seriali a pari, ma non credo che nel tuo caso sia utile
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Il_Palmi

Ho provato a riscrivere il codice così:

Code: [Select]
#include <SoftwareSerial.h>
SoftwareSerial esp(3,2);

void setup() {
  Serial.begin(9600);
  esp.begin(9600);
  esp.print("AT+CWLAP\r\n");
}

void loop() {
  if (esp.available()) {            // ESP wants to talk to you
    Serial.write(esp.read());       // Log out what ESP wants to say
  }
}


Ma ottengo sempre lo stesso risultato, ovvero testo incomprensibile.

gpb01

Sei sicuro che l'ESP stia trasmetterno a 9600?  Perché se tu imposti su Arduino 9600, ma l'ESP sta trasmettendo ad altra velocità, quello che vedi è incomprensibile ... ::)

Guglielmo
Search is Your friend ... or I am Your enemy !

gpb01

... se invece parte del testo è ok ed il resto no, la velocità è probabilmente giusta, ma ... potrebbe essere insufficiente il buffer della SoftwareSerial() e quindi, dopo N caratteri, il resto te li perdi.

Guglielmo
Search is Your friend ... or I am Your enemy !

Standardoil

Mentre usando i pin 0 e 1 con il monitor seriale va bene?
Che strano...

Per rispondere invece a Guglielmo...
Se il primo pezzo è ok la velocità e la parità sono ok
Semmai forse è lo esp che si impiantato, e quello che vediamo è il suo debug
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

Standardoil

Non mi convince la questione velocità...
Semmai si rialza la seriale usb...
Prima legge di Nelson (che sono io): Non scambiare il fine con il mezzo: ricorda "cosa" devi fare, non "come" devi farlo

Non bado a studenti, che copino altrove

Tu hai problema-Io ti domando-Tu non mi rispondi: vuol dire che non ti serve più

gpb01

Per rispondere invece a Guglielmo...
Se il primo pezzo è ok la velocità e la parità sono ok
... ho dato DUE risposte, la seconda prevede questa possibilità ed identifica forse altrove il problema.

Guglielmo
Search is Your friend ... or I am Your enemy !

Il_Palmi

... se invece parte del testo è ok ed il resto no, la velocità è probabilmente giusta, ma ... potrebbe essere insufficiente il buffer della SoftwareSerial() e quindi, dopo N caratteri, il resto te li perdi.

Guglielmo
Le velocità sono identiche e leggo bene solo la prima parte del testo. Penso anch'io che sia un problema di buffer ma non so proprio come si possa risolvere.

Non mi convince la questione velocità...
Semmai si rialza la seriale usb...
In che senso?

gpb01

Le velocità sono identiche e leggo bene solo la prima parte del testo. Penso anch'io che sia un problema di buffer ma non so proprio come si possa risolvere.
Le dimensioni del buffer della SoftwareSerial() sono definite nel codice della libreria ...
... ti basta provare ad ingrandirlo e vedere se la cosa migliora.

Guglielmo

P.S.: Ho avuto lo stesso problema con i dati di un GPS ;)
Search is Your friend ... or I am Your enemy !

gpb01

All'inizio di SoftwareSerial.h hai:

Code: [Select]
#ifndef _SS_MAX_RX_BUFF
#define _SS_MAX_RX_BUFF 64 // RX buffer size
#endif

... dove è definita la dimensione del buffer ;)

Guglielmo

Search is Your friend ... or I am Your enemy !

gpb01

... altra possibilità è provare ad utilizzare la più efficiente AltSoftwareSerial(), scritta da Paul Stoffregen, che trovi QUI.

Anche in questa, se servisse, nel file AltSoftwareSerial.cpp si trova:

Code: [Select]
#define RX_BUFFER_SIZE 80
static volatile uint8_t rx_buffer[RX_BUFFER_SIZE];

... e quindi è abbastanza facile incrementare il buffer di ricezione.

Guglielmo
Search is Your friend ... or I am Your enemy !

Il_Palmi

Ok risolto, era un problema di limite del buffer. Grazie a tutti per l'aiuto

zoomx

Potresti modificare il titolo del thead aggiungendo un bel [Risolto] all'inizio?

Go Up