Go Down

Topic: SoftwareSerial - problema in read (Read 648 times) previous topic - next topic

lollotek

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ì:
Code: [Select]

#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ì:
Code: [Select]
#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?

cyberhs

Prova così.

Code: [Select]

#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);
  }

}


lollotek

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?

leo72

Perche il metodo listen() svuota il buffer  :P

lollotek


Perche il metodo listen() svuota il buffer  :P


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..

leo72

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

lollotek


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..

leo72

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.

cyberhs

Quote

...
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.).

Go Up