Pages: [1]   Go Down
Author Topic: SoftwareSerial - problema in read  (Read 608 times)
0 Members and 1 Guest are viewing this topic.
Senago - Milano
Offline Offline
God Member
*****
Karma: 3
Posts: 508
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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:
#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?
Logged

Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1501
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Prova così.

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

}

Logged

Senago - Milano
Offline Offline
God Member
*****
Karma: 3
Posts: 508
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22938
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Perche il metodo listen() svuota il buffer  smiley-razz
Logged


Senago - Milano
Offline Offline
God Member
*****
Karma: 3
Posts: 508
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Perche il metodo listen() svuota il buffer  smiley-razz

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22938
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Senago - Milano
Offline Offline
God Member
*****
Karma: 3
Posts: 508
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22938
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Selvazzano Dentro - Padova
Offline Offline
Edison Member
*
Karma: 45
Posts: 1501
"Chi sa fa, chi non sa insegna"
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Pages: [1]   Go Up
Jump to: