Pages: [1]   Go Down
Author Topic: comunicazione seriale tra due arduino  (Read 2099 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buongiorno a tutti è da un po che mi scervello su un piccolo problema di codice e volevo chiedere aiuto per capire dove fose il problema.....


master:
Code:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(2, 3); // RX, TX
int x[6];
int a=0;
void setup() 
{pinMode(13, OUTPUT);
pinMode(8, INPUT);
pinMode(9, INPUT);
  Serial.begin(9600);
   while (!Serial) {
    ;
  }
  mySerial.begin(9600);
}

void loop()
{
 if(digitalRead(8)==HIGH)//invia il dato in seriale
{
   for(a=0;a<6;a++){
      mySerial.write(a);
    ;}}

 if(mySerial.available()>=6){ //leggo sempre la seriale
  for(a=0;a<6;a++){
   x[a]=mySerial.read();}}
   
if(digitalRead(9)==HIGH){//
    delay(200);
   
      for(a=0;a<6;a++){
      mySerial.write(x[a]);
      Serial.println(x[a]);
      }
   
}
}

slave:
Code:
#include <SoftwareSerial.h>

SoftwareSerial mySerial(2, 3); // RX, TX

void setup() 
{
  pinMode(13, OUTPUT);
  pinMode(9, INPUT);
  Serial.begin(9600);
  while (!Serial) {
    ;
  }
  mySerial.begin(9600);

}
int x[6];
int a=0;
void loop()
{
  if(digitalRead(9)==HIGH){
    delay(200);
      for(a=0;a<6;a++){
      mySerial.write(x[a]);
      Serial.println(x[a]);
    }
  }
  if(mySerial.available()>=6){
    for(a=0;a<6;a++){
      x[a]=mySerial.read();
    }
  }
  //}



  }

il problema è che lo slave riceve il dato in modo corretto invece quando lo slave risponde con il codice ricevuto sul master l'ordine di arrivo e memorizzazione sulla variabile non è nell'ordine correto  ricevo
master invia 012345
slave riceve 012345
slave riinvia 012345
master riceve 450123

cosa puo essere come errore??? grazie
Logged

Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 143
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ma i pin 8 e 9 a cosa sono collegati??
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

sono collegati a dei microswitch che premo io
Logged

Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 143
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

prova a mettere un piccolo ritardo dopo ogni lettura da seriale..basta anche una delay(1) credo..io avevo lo stesso problema ed ho risolto cosi..
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho provato come mi hai detto ma ricevo sempre dati in ordine ma spostati....
Logged

Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 143
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

ma hai provato a stampare il contenuto dell'array quando ricevi? dopo la read dico
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 ho ho provato con questo codice e me lo riceve giusto
 
Code:
if(mySerial.available()>=6){
    for(a=1;a<7;a++){
      x[a]=mySerial.read();
       Serial.println(x[a]);
    }
    delay(10);
    for(a=1;a<7;a++){
      mySerial.write(x[a]);
  }
quando lo re invia e lo leggo sul altro arduino con questo codice  me lo riceve o con errori alle volte tipo qualche volta ricevo 255 oppure la maggiorparte delle volte ricevo 540123 invece l'altro invia 012345....
Code:
if(digitalRead(9)==HIGH){
    delay(200);
      for(a=0;a<6;a++){
      mySerial.write(a);
      Serial.println(a);
    }
  }
  if(mySerial.available()>=6){
    for(a=0;a<6;a++){
      x[a]=mySerial.read();
    }
  }
  if(digitalRead(8)==HIGH){ delay(300);
   for(a=0;a<6;a++){
      Serial.println(x[a]);
    ;}}
}
Logged

Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 143
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

prova cosi

Code:

if(mySerial.available()>=6){
    for(a=1;a<7;a++){
      x[a]=mySerial.read();
       Serial.println(x[a]);
    }
    mySerial.flush();
    delay(10);
    for(a=1;a<7;a++){
      mySerial.print(x[a]);
  }


e dall'altro mettere

Code:
if(digitalRead(9)==HIGH){
    delay(200);
      for(a=0;a<6;a++){
      mySerial.print(a);
      Serial.println(a);
    }
  }
  if(mySerial.available()>=6){
    for(a=0;a<6;a++){
      x[a]=mySerial.read();
    }
  }
  if(digitalRead(8)==HIGH){ delay(300);
   for(a=0;a<6;a++){
      Serial.println(x[a]);
    ;}}
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

allora diciamo che funziona ma c'e un pero smiley nel senso che il dato questa volta mi arriva giusto ma solo alla seconda pressione del pulsante.....
Logged

Fidenza (PR)
Offline Offline
Full Member
***
Karma: 3
Posts: 143
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

prova a togliere la mySerial.flush()..forse è quella che blocca..
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho provato levando quella riga di comando ma rimane uguale il problema mi riceve il dato giusto al secondo invio...ho provato a cambiare la velocita di trasferimento ma ancora nulla cosi ho provato a fare un cambiamento sullo slave rimuovendo la seriale software e collegarla sul quella hardware e  magicamente funziona alla prima pressione..ricevo il dato esatto...diciamo che non ne avrei mooolto bisogno di quella software dato che poi lo devo sostituire il tutto con un mega  era piu per comodita nel caso avessi bisogno ri riprogrammare senza dover staccare il tutto ogni volta...

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

riprendo in mano questo mio problema....
allora mi sono accorto che se accendo l'arduino master e dopo quello slave ricevo i dati in modo esatto
invece se dopo vari invii spengo e ri-alimento il master lo slave riceve sempre i dati ma come detto nei precedenti post mi arrivano sfalsati...
e se mi faccio stampare i dati ricevuti mi accorgo che sono giusti i dati ma invece di ricevere:
1             ricevo:  7 oppure   6
2                        1             7
3                        2             1
4                        3             2
5                        4             3
6                        5             4
7                        6             5
Logged

Pages: [1]   Go Up
Jump to: