Go Down

Topic: [RISOLTO] SoftwareSerial chi la usa? (Read 923 times) previous topic - next topic

medimax

Jul 03, 2012, 01:55 pm Last Edit: Jul 03, 2012, 08:44 pm by medimax Reason: 1
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

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

PaoloP

#1
Jul 03, 2012, 02:11 pm Last Edit: Jul 03, 2012, 02:13 pm by PaoloP Reason: 1
--> http://arduino.cc/en/Serial/read
Esempio:
Code: [Select]
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.
Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

medimax

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

pitusso

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

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

medimax

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

pitusso

@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:

Code: [Select]
pinMode(2, INPUT);   // RX
pinMode(3, OUTPUT);  // TX


c'è un motivo per cui lo fai?

medimax

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

pitusso

Ciao

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

medimax

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

superp

#9
Jul 03, 2012, 03:22 pm Last Edit: Jul 03, 2012, 03:25 pm by superp Reason: 1
Quote
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
"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

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

superp


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:
Quote
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.
"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

medimax

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

Quote
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

medimax

#13
Jul 03, 2012, 08:37 pm Last Edit: Jul 03, 2012, 08:43 pm by medimax Reason: 1
Grazie superp, il problema risiedeva proprio nella mega, non utilizzavo i pin giusti, ora comunica perfettamente.
Quote
pinMode(2, INPUT);   // RX
pinMode(3, OUTPUT);  // TX

c'è un motivo per cui lo fai?

Pitusso, qui ho trovato questi settaggi http://www.pjrc.com/teensy/td_libs_SoftwareSerial.html

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

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

tonid

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  :smiley-mr-green:

Go Up