[RISOLTO] SoftwareSerial chi la usa?

Buongiorno...
sono alle prese con la libreria SoftwareSerial vorrei far comunicare un arduino UNO con un MEGA ma non capisco cio che non funziona.
Chi sa come posso fargli passare un codice che dopo analizzo con una serie di "if"??

posto i miei sketch

ARDUINO UNO master

#include <SoftwareSerial.h>
SoftwareSerial mySerial = SoftwareSerial(2 , 3);

void setup(){
  pinMode(2, INPUT);   // RX
  pinMode(3, OUTPUT);  // TX
  mySerial.begin(9600);
  mySerial.flush(); // svuoto il buffer di ricezione seriale

Serial.begin(9600);
}

void loop(){
mySerial.println("CIAO");
}

ARDUINO MEGA il ricevente

#include <SoftwareSerial.h>

SoftwareSerial mySerial(2 , 3);

void setup(){ 
  pinMode(2, INPUT);   // RX
  pinMode(3, OUTPUT);  // TX
  pinMode(6, OUTPUT);
  Serial.begin(9600);
  Serial.println("Ciao sono ARDUMEGA");
  mySerial.begin(9600);
  mySerial.flush(); // svuoto il buffer di ricezione seriale
}

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

lo scopo iniziale e leggere "CIAO" sulla seriale del MEGA, ho collegato la massa in comune ed il pin2 dell'UNO con il 3 del MEGA e viceversa..

--> http://arduino.cc/en/Serial/read
Esempio:

int incomingByte = 0;   // for incoming serial data

void setup() {
        Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
}

void loop() {

        // send data only when you receive data:
        if (Serial.available() > 0) {
                // read the incoming byte:
                incomingByte = Serial.read();

                // say what you got:
                Serial.print("I received: ");
                Serial.println(incomingByte, DEC);
        }
}

La seriale legge un byte alla volta. Puoi modificare il codice inserendo un while per leggere tutto il messaggio. Devi, inoltre, crearti un buffer per registrare i dati in arrivo.

Ok, ma tu non usi la SoftwareSerial e non trasformi la ricezione in uscita su seriale per capire se riceve qualcosa..

Ciao,
io uso la sw seriale spesso (rfid, bluetooth, per esempio).
Un codice che puoi provare è questo:

#include <SoftwareSerial.h>     //IDE >= 1.0
//#include <NewSoftSerial.h>    //IDE <= 0023

const int rxPin = 2;
const int txPin = 3;

SoftwareSerial mySwSerial(rxPin, txPin);  //IDE >= 1.0
//NewSoftSerial mySwSerial(rxPin, txPin);   //IDE <= 0023

void setup() {
  
  Serial.begin(9600);
  mySwSerial.begin(9600);

  Serial.println("Seriali attive...");
}

void loop() {
  if (mySwSerial.available()) {  
    Serial.write(mySwSerial.read());
  }
  
  if (Serial.available()) {
    mySwSerial.write(Serial.read());
  }
}

Di base questo codice prende quel che arriva sulla sw serial, e lo redireziona su seriale hw.
E viceversa.

Considera che la MEGA ha a disposizione più seriali hw.

Grazie Pitusso,

si lo so per la mega, ma a me serve come test per un standalone, nei miei sketch ho cercato di semplificare il circuito in modo da farlo restare in ascolto ma non capisco se spedisce o no...
effettivamente non li ho resi costanti i pin, sta sera provo...

@medimax
prima non ho guardato per bene il tuo codice, ma mi salta all'occhio questa cosa, in riferimento ai pin utilizzati per la SoftwareSerial:

pinMode(2, INPUT);   // RX
pinMode(3, OUTPUT);  // TX

c'è un motivo per cui lo fai?

c'è un motivo per cui lo fai?

L'ho trovato in uno sketch sul sito ieri cercando di farlo funzionare, ed ho provato ad adottarlo... Mi sembrava logico che uno era come ingresso ed uno come uscita...

Ciao

L'ho trovato in uno sketch sul sito ieri cercando di farlo funzionare, ed ho provato ad adottarlo... Mi sembrava logico che uno era come ingresso ed uno come uscita...

su che sito?
Cmq non l'ho mai usato, nè visto usare, e mi sa pure che non è molto igienico...

Cmq non l'ho mai usato, nè visto usare, e mi sa pure che non è molto igienico...

Ok, poi riprovo senza, il sito or ora non me lo ricordo, ieri e domenica ne ho letti 1000 sta sera vedo se lo ritrovo. Comunque se tu non lo usi poi lo elimino, mi serve solo riuscire a farli parlare l'un l'altro per capire come funziona, poi me lo studio per benino... Il problema e che in giro non ho trovato la comunicazione tra 2 arduino in seriale, ma solo in i2c (ottima se vicini). Sono riuscito anche a pilotare dal pc gli ingressi dell'arduino sulla seriale, ma tra i 2 arduino ancora nulla.. Non capisco manco se comunicano tra loro o se tutto tace...

Non capisco manco se comunicano tra loro o se tutto tace...

Il codice che hai postato sopra, non funziona perchè sul mega non leggi da seriale, ma scrivi. Anche se facessi un read al posto di un write il risultato (come ha detto qualcuno prima di me) non stampi a video il mesaggio ricevuto.....quindi come ti accorgi se la trasmissione è avvenuta con successo? Inoltre perchè usi la software serial sul Mega? hai a disposizione 4 seriali hardware da usare a tuo piacimento. Ultima cosa, prima di Serial.begin nel setup aggiungi sempre un delay(2000), perchè potresti bloccare la seriale. certo la situazione è di facile recupero, ma percè perdere tempo cercando di beccare il momento giuto pr rilasciare il reset?
una delle ultime discussioni a rguardo:
http://arduino.cc/forum/index.php/topic,112680.0.html
N.

Edit: ho letto troppo velocemente sorry

Superp,

uso la libreria perche con il mega sto provando e vorrei passare ad uno standalone.
nello sketch mega ce un read da mySeriale e print sulla seriale normale.

ottimo il consiglio della delay 2000 iniziale...

medimax:
Superp,

uso la libreria perche con il mega sto provando e vorrei passare ad uno standalone.
nello sketch mega ce un read da mySeriale e print sulla seriale normale.

ottimo il consiglio della delay 2000 iniziale...

Non sono esperto in standalone, anzi non ne ho mai fatto uno, quindi continuo a non capire la necessità di usare le seriali software sul mega, mica sono legate alla scheda arduino, ma al micro 2560. Corregetemi se sbaglio. In realtà ti volevo sviare dalle software serial perchè ipotizzo siano state scritte per micro con una sola porta seriale, supponendo che non ce ne fosse necessità per micro con più serial. Anch'io c'ho sbattuto la testa se ti interessa, fino a quando ho letto (era semplicissimo) il reference softwareSerial, che riporta:

Limitations
The library has the following known limitations:
If using multiple software serial ports, only one can receive data at a time.
Not all pins on the Mega and Mega 2560 support change interrupts, so only the following can be used for RX: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69
Not all pins on the Leonardo support change interrupts, so only the following can be used for RX: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

Quindi ricevendo sulla 2 (se nn ricordo male) non può funzionare. Io personalmente ho usato i 52 e 53, (ma hai una vasta scelta) per poi abbandonare le software ed abbracciare le hardware.
http://arduino.cc/hu/Reference/SoftwareSerial
N.

Not all pins on the Mega and Mega 2560 support change interrupts, so only the following can be used for RX: 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

Azz.. Questo mi piace come logica mi fa capire parecchie cose... ora provo...

quindi continuo a non capire la necessità di usare le seriali software sul mega

La mega non considerarla tale, è una scheda come un altra per fare esperimenti che NON utilizzerò per il progetto finale

Grazie superp, il problema risiedeva proprio nella mega, non utilizzavo i pin giusti, ora comunica perfettamente.

pinMode(2, INPUT); // RX
pinMode(3, OUTPUT); // TX

c'è un motivo per cui lo fai?

Pitusso, qui ho trovato questi settaggi SoftwareSerial Library, DO NOT USE. NewSoftSerial works much better.

Posto i codici non si sa mai che a qualcuno servano:

MASTER

#include <SoftwareSerial.h>
const int rxPin = 2;
const int txPin = 3;

SoftwareSerial mySerial(rxPin, txPin);

void setup(){
  mySerial.begin(4800);
  Serial.begin(9600);
  delay(2000);
  Serial.println("Seriali attive...");
}
void loop(){
mySerial.write("eco");
delay(5000);
}

SLAVE

#include <SoftwareSerial.h>
const int rxPin = 52;
const int txPin = 53;

SoftwareSerial mySerial(rxPin, txPin);

void setup(){ 
  mySerial.begin(4800);
  Serial.begin(9600);
  Serial.println("Ciao sono ARDUMEGA");
  delay(2000);
  Serial.println("Seriali attive...");
}

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

Ciao medimax, nell'esempio del playground non fa vedere la voce const int rxPin = 2; ma mette direttamente il numero del pin all'interno della SoftwareSerial mySerial(rxPin,txPin); .
Mi chiedo se hai voglia di provare a vedere se funzionalo stesso :grin:

Ciao Tonid,

ti confermo che mettendo su entrambi

#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3);

funziona lo stesso...

Grazie ,torna sempre utile sapere :grin:

Grazie superp, il problema risiedeva proprio nella mega, non utilizzavo i pin giusti, ora comunica perfettamente.

Felice di essere stato utile.enjoy
N.