problema con SoftwareSerial e NewSoftSerial

volevo provare ad usare la libreria SoftwareSerial e stavo leggendo dal reference:

ho copiato l'esempio:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3);

void setup()  
{
  Serial.begin(57600);
  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

e ho provato a compilarlo ma mi da degli errori :~

try_SoftwareSerial.cpp: In function 'void loop()':
try_SoftwareSerial:16: error: 'class SoftwareSerial' has no member named 'available'
try_SoftwareSerial:19: error: 'class SoftwareSerial' has no member named 'write'

cosa significa? cosa ho sbagliato?
grazie :wink:

Inizia a mettere la parentesi {{ }} al punto giusto....

void loop() // run over and over
{
  if (mySerial.available()>0) {
    Serial.write(mySerial.read());}
  if (Serial.available()>0) {
    mySerial.write(Serial.read());}
}

...anche se probabilmente l'errore non è tutto qua!

che versione di arduino IDE?

si va beh ho detto che stovo provando a compilare l'esempio che c'è nel reference, comunque non penso proprio sia questo l'errore, anzi per una sola operazione le parentesi non sono necessarie e si possono omettere... non lo compila comunque :~
ho la versione 0022... è da un paio di giorni che mi chiede di aggiornarla ma non l'ho ancora fatto...
approproposito mi consigliate di aggiornarlo? non è che dopo ho problemi?

i problemi li hai se aggiorni, la versione 1.0 dell'ide è nuova e apporta grossi cambiamenti, per cui alcune librerie vanno sistemate

un consiglio: usa la NewSoftSerial, per una serie di motivi.

ok quindi mi tengo la versione vecchia?
per la SoftwareSerial non si può usare? devo usare per forza la NewSoftwareSerial?

Siccome sono curioso, ho copiato il tuo codice. E neanche a me compila, dando gli stessi errori.
Per curiosità ho dato un'occhiata alla libreria e dentro NON ci sono quei metodi.... :expressionless:
Ci sono solo i metodi begin, print, println e read.... Non capisco....

IDE 0022 su Linux

la softSerial è una versione molto tarpiata della seriale, il semplice fatto che se non stai facendo una read quindo hai un input perdi i dati in arrivo...

quindi è un problema della libreria? certo che mettere un esempio che non va non è proprio bello...
comunque read e print ci sono, quindi se non mi servono write e available dovrei essere apposto?

approposito la funzione available a cosa serve precisamente? è indispensabile per fare il read? o posso fare a meno?
grazie

quando arrivano dei dati e tu stai facendo altro, vengono messi in un buffer, e per sapere quanti dati sono in attesa di essere letti nel buffer, usi available. Come dicevo prima, la SoftSerial NON ha un buffer e i dati vengono persi nel nulla... quindi non serve (e quindi non esiste) la available().

Secondo me tu hai trovato un esempio della NewSoftSerial, che essendo più avanzata questi controlli ce li ha... oppure FORSE nella versione 1.0 dell'ide la newSoftSerial è andata a sostituire l'orami obsoleta SoftSerial..... chissà

io stavo leggendo questo:

perchè Leo mi aveva consigliato di usarla sui Tiny, ma prima volevo provarla sul 2009, visto che non l'avevo mai usata prima...
comunque il problema dell'available vedro di inventarmi qualcosa per risolverlo :wink:

Ma non va bene che ci siano solo i metodi read, begin e print/ln!
Voglio dire che

elenca i seguenti metodi:
SoftwareSerial()
available()
begin()
isListening()
overflow()
read()
print()
println()
listen()
write()

Dove sono andati a finire??? :expressionless:

Lo stesso spezzone copiato da ER (medici in prima linea) è lo stesso presente nella pagina come esempio:

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3);

void setup()  
{
  Serial.begin(57600);
  Serial.println("Goodnight moon!");

  // set the data rate for the SoftwareSerial port
  mySerial.begin(4800);
  mySerial.println("Hello, world?");
}

void loop() // run over and over
{
  if (mySerial.available())
    Serial.write(mySerial.read());
  if (Serial.available())
    mySerial.write(Serial.read());
}

appunto è questa la cosa strana :~

mi spiace ma sicuramente softwareserial non ha available(), o se c'è è fasullo per i motivi elencati sopra.

chiunque abbai scritto quella classe l'ha copiata paro paro dagli esempi di NewSoftSerial, semplicemente cancellando New!

infatti osservando SoftwareSerial.h:

SoftwareSerial(uint8_t, uint8_t);
    void begin(long);
    int read();
    void print(char);
    void print(const char[]);
    void print(uint8_t);
    void print(int);
    void print(unsigned int);
    void print(long);
    void print(unsigned long);
    void print(long, int);
    void println(void);
    void println(char);
    void println(const char[]);
    void println(uint8_t);
    void println(int);
    void println(long);
    void println(unsigned long);
    void println(long, int);

niente write, listen, available, isListening, overflow... per un semplice motivo: no interrupt = no listen e islistening = no buffer = no overflow, available...

e infatti, sempre leggendo quella pagina di reference:

The version of SoftwareSerial included in 1.0 and later is based on the NewSoftSerial library by Mikal Hart.

quindi qulli sono i metodi della NewSoftwareSerial, che nell'IDE1.0 ha soppiantato la vecchia SoftwareSerial, rubandogli pure il nome (e secondo me creerà un sacco di casini ciò)

Che brutta cosa... :roll_eyes:

ma le due librerie non possono coesistere indicando l'una o l'altra dentro a determinate funzioni?

le librerie nascono apposta per evitare questi casini...

ok quindi abbiamo scoperto il motivo per cui SoftwareSerial non va come pensavo che andasse :relaxed:
ora sto provando la NewSoftSerial sembra che vada ma ho un problema del quale non capisco il motivo, ho collegato il 2009 con la NewSoftSerial alla Serial1 del mega2560... quindi ho caricato questi due sketch:
questo per il 2009:

#include <NewSoftSerial.h>
NewSoftSerial ER_likenoother(2, 3);

void setup()  
{
  Serial.begin(115200);
  ER_likenoother.begin(115200);
}

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

e questo per il mega:

void setup()  
{
  Serial.begin(115200);
  Serial1.begin(115200);
}

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

e quindi ho aperto 2 serial monitor e invio su uno e ricevo sull'altro...
quando invio dal 2009 al mega non ho problemi e leggo quello che ho inviato, mentre quando invio dal mega al 2009 leggo delle cose strane sul serial monitor abbinato al 2009...
è un problema del NewSoftSerial o ho sbagliato io qualcosa? :~
grazie ancora per l'aiuto :wink:

Preso dalla pagina del reference:

Using speeds higher than 9600 baud will result in faulty communication.

dov'era scritto?? questa frase non l'avevo proprio notata...
comunque adesso ho provato a 9600 e va, grazie :wink: