Pages: [1] 2   Go Down
Author Topic: [RISOLTO] SoftwareSerial chi la usa?  (Read 861 times)
0 Members and 1 Guest are viewing this topic.
Udine
Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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:
#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..
« Last Edit: July 03, 2012, 01:44:05 pm by medimax » Logged

Cagliari, Italy
Offline Offline
Tesla Member
***
Karma: 112
Posts: 7126
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

--> http://arduino.cc/en/Serial/read
Esempio:
Code:
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.
« Last Edit: July 03, 2012, 07:13:56 am by PaoloP » Logged

Code fast. Code easy. Codebender --> http://codebender.cc/?referrer=PaoloP

Udine
Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2309
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
#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.
Logged

Udine
Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2309
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@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:
pinMode(2, INPUT);   // RX
pinMode(3, OUTPUT);  // TX

c'è un motivo per cui lo fai?
Logged

Udine
Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Edison Member
*
Karma: 24
Posts: 2309
Have you mooed today?
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Udine
Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Italy
Offline Offline
Full Member
***
Karma: 6
Posts: 102
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: July 03, 2012, 08:25:46 am by superp » Logged

"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

Udine
Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Italy
Offline Offline
Full Member
***
Karma: 6
Posts: 102
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

"The question is not whether intelligent machines can have emotions, but whether machines can be intelligent without any emotions"

Udine
Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Udine
Offline Offline
Jr. Member
**
Karma: 0
Posts: 72
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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:
#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());
  }
}
« Last Edit: July 03, 2012, 01:43:44 pm by medimax » Logged

Torino
Offline Offline
God Member
*****
Karma: 3
Posts: 766
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1] 2   Go Up
Jump to: