Go Down

Topic: problema con SoftwareSerial e NewSoftSerial (Read 5652 times) previous topic - next topic

ƎR

Dec 09, 2011, 11:48 am Last Edit: Dec 09, 2011, 10:33 pm by er_like_no_other Reason: 1
volevo provare ad usare la libreria SoftwareSerial e stavo leggendo dal reference:
http://arduino.cc/en/Reference/SoftwareSerial
ho copiato l'esempio:

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

Code: [Select]
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 ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

ivan64

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

Code: [Select]

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!

lesto

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ƎR

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?
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

lesto

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.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ƎR

ok quindi mi tengo la versione vecchia?
per la SoftwareSerial non si può usare? devo usare per forza la NewSoftwareSerial?
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

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....  :|
Ci sono solo i metodi begin, print, println e read.... Non capisco....

IDE 0022 su Linux

lesto

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...
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ƎR

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
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

lesto

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à
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ƎR

io stavo leggendo questo:
http://arduino.cc/en/Reference/SoftwareSerial
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 ;)
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

leo72

Ma non va bene che ci siano solo i metodi read, begin e print/ln!
Voglio dire che
http://arduino.cc/en/Reference/SoftwareSerial
elenca i seguenti metodi:
SoftwareSerial()
available()
begin()
isListening()
overflow()
read()
print()
println()
listen()
write()

Dove sono andati a finire???  :|

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

Code: [Select]
#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());
}

ƎR

appunto è questa la cosa strana  :~
Riccardo Ertolupi of the Vicenza Thunders Team: http://www.VicenzaThunders.com

lesto

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:

Code: [Select]
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:
Quote
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ò)

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

leo72


Go Up