SoftwareSerial - problema in read

Ciao, avrei bisogno di qualche dritta per risolvere un problema che sto riscontrando con la software serial.
Praticamente sembra che legga sempre il primo byte dello stream di dati che mi arriva, mentre so per certo che i byte in arrivo sono diversi (testato con successo con la seriale hardware)
ho provato sia così:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX

void setup()  
{
  Serial.begin(57600);
  mySerial.begin(57600);
}

void loop() 
{
  mySerial.listen();
    Serial.println(mySerial.read());
}

che così:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX

void setup()  
{
  Serial.begin(57600);
  mySerial.begin(57600);
}

void loop() 
{
  if (mySerial.available()){
    Serial.println(mySerial.read());
  }
}

Ma in uscita vedo sempre e soltanto 170, che è il valore del primo byte che dovrei ricevere.
Onestamente non ho trovato che siano necessari altri particolari modi di uso.
il ground è in comune, anche perchè ripeto, facendo tutto da seriale hardware funziona.
nessuna idea?

Prova così.

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
unsigned long Timer;
String Buffer;                                       // buffer Rx/Tx

void setup() {
  Serial.begin(57600);
  mySerial.begin(57600);
}

void loop() {
  Buffer = "";
  T = millis();
  
  while (millis() - T < 10)  {
    while (mySerial.available() > 0) {
      Buffer += char(mySerial.read());
    }
  }

  if (Buffer.length() > 0) {                  // transmit to Serial Monitor        
    Serial.print(Buffer);
  }

}

grazie, sembra andare, lo devo prima adattare alle mie esigenze per averne una conferma.
ma quale sarebbe la logica sotto ?
cosa cambia tra farlo leggere dal main loop e farlo leggere da un while?

Perche il metodo listen() svuota il buffer :stuck_out_tongue:

leo72:
Perche il metodo listen() svuota il buffer :stuck_out_tongue:

ma io ho provato sia con che senza..
e poi piuttosto mi sarei aspettato un flusso di dati casuale e non solo l'inizio di un messaggio..

Uhm... fammi capire. Ma tu hai spedito UNA stringa ma ne leggi solo e continuamente il 1° carattere oppure spedisci continuamente dei dati?

leo72:
Uhm... fammi capire. Ma tu hai spedito UNA stringa ma ne leggi solo e continuamente il 1° carattere oppure spedisci continuamente dei dati?

mi sono collegato ad una periferica che continua a sparare un flusso continuo di dati, io lo volevo leggere, e rimandare sulla seriale hardware..

La procedura corretta per leggere più di un byte dalla seriale in sequenza è quella che ti ha illustrato Cyber.
Non capisco però con il metodo da te usato perché perda i caratteri e ti presenti sempre e solo il primo. Andrebbe esaminato il sorgente della SoftwareSerial per capire come funziona.

...
ma quale sarebbe la logica sotto ?
cosa cambia tra farlo leggere dal main loop e farlo leggere da un while?

Non dobbiamo dimenticare che SerialSoftware vorrebbe simulare un UART che è molto più veloce.

In realtà si ha a che fare con un'interrupt che può "perdere per strada" alcuni byte ricevuti, non essendoci alcun handshake tipo Xon-Xoff.

Quindi è necessario "concentrare" la cattura dei byte ricevuti mediante l'uso di un buffer.
La routine potrebbe essere anche scritta con degli if e usando un vettore char opportunamente dimensionato: è stata solo una mia scelta per poter più facilmente gestire i dati in arrivo (esempio: trim(), uppercase(), toInt(), ecc.).