Go Down

Topic: comunicazione seriale tra due arduino (Read 2346 times) previous topic - next topic

izio90

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

#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

mancio

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

izio90

sono collegati a dei microswitch che premo io

mancio

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

izio90

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

mancio

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

izio90

ho ho provato con questo codice e me lo riceve giusto
Code: [Select]
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: [Select]
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]);
    ;}}
}

mancio

prova cosi

Code: [Select]


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

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]);
    ;}}
}

izio90

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

mancio

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

izio90

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


izio90

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

Go Up