¿Como funciona Comunicacion serie entre 2 arduinos?

Hola gente:

Tengo un UNO y un Leonardo enlazados mediante Xbee, y quiero que el led de uno de ellos parpadee cada 500 ms y el otro cada segundo. No sé como funciona bien la comunicación serie entre ambos. Tengo la siguiente configuración:

En el Leonardo:

const int ledPin = 13; // the pin that the LED is attached to
int incomingByteLEO;      // a variable to read incoming serial data into

void setup() {
  // initialize serial communication:
  Serial.begin(9600);
  Serial1.begin(9600);
  
  // initialize the LED pin as an output:
  pinMode(ledPin, OUTPUT);
  while(!Serial){;}
}

void loop() {
  while(Serial.available()>0){ 
   Serial1.write(Serial.read());// input from Serial to Serial1
 }
 while(Serial1.available()>0){
   Serial.write(Serial1.read()); //input from Serial1 to Serial
 }
  Serial.print('H');
  delay(500);
  Serial.print('L');
  delay(500);
  // see if there's incoming serial data:
  
    // read the oldest byte in the serial buffer:
    incomingByteLEO = Serial.read();
    // if it's a capital H (ASCII 72), turn on the LED:
    if (incomingByteLEO == 'H') {
      digitalWrite(ledPin, HIGH);
    } 
    // if it's an L (ASCII 76) turn off the LED:
    if (incomingByteLEO == 'L') {
      digitalWrite(ledPin, LOW);
    }
  
}

Mientras en el UNO tengo este sketch:

const int ledPin = 13; // the pin that the LED is attached to
int incomingByte;

void setup(){   
Serial.begin(9600); 
pinMode(ledPin, OUTPUT);
} 
void loop(){   
Serial.print('H');  
delay(1000);  
Serial.print('L');  
delay(1000);

    
while(Serial.available()>0){
// read the oldest byte in the serial buffer:
    incomingByte = Serial.read();
    // if it's a capital H (ASCII 72), turn on the LED:
    if (incomingByte == 'H') {
      digitalWrite(ledPin, HIGH);
    } 
    // if it's an L (ASCII 76) turn off the LED:
    if (incomingByte == 'L') {
      digitalWrite(ledPin, LOW);
    }
 }
}

Consigo que ambos leds se enciendan cada segundo, pero no de distinta velocidad, no sé si la comunicación es full-duplex, half-duplex o no tiene nada que ver eso.

Un saludo y gracias por anticipado.

Primero debes comprender que la comunicación entre ambos requiere 1. gnd unida de ambos 2. tx de leonardo a rx de UNO 3. rx de leonardo a tx de UNO

EL programa en el UNO esta bien, envia H espera 1 seg envia L espera 1 segundo Si recibe H prende el LED si recibe L lo apaga.

En el Loenardo No entiendo para que todo lo que se reciba por Serial se envia a Serial1 y viceverza. Finalmente repites la secuencia pero a intervalos mas rápidos de 500mseg o 1/2 seg

Asi lo tienes cableado y funciona?

Creo yo por lo poco que entiendo es que tiene conectado dos serial en un arduino. es decir del en el LEONARDO tiene un serial al ardiono UNO, y de este ultimo sale otra conexion a serial de nuevo al LEONARDO ..... he visto algunas conexiones puentes entre mas de un arduino, es decir conexiones escaleras. Y por eso es que en el Sketch tiene Serial y Serial1. ¿Creo? no lo tengo claro de verdad? :-X

Uso serial1 ya que en Leonado el serial se reserva para la comunicación con el USB. El código de reenviar lo se serial1 a serial lo vi en un fix del Leonado (Aunque no me queda claro lo que hace).

Entonces en el Leonardo poniendo el mismo código que en UNO cambiando el delay por 500 no consigo nada. Y ambos leds se encienden cada segundo.

¿Podría ser por usar el mismo caracter H y L?

intenta esto… elimina en un arduino el envio de comandos. Y prueba como el otro los recibe y si lo hace bien o no.
Asi determinarás cual esta mal y que debes hacer.

Ya he ido acotando problemas y he aprendido bastante. Por si le sirve a alguien, parece ser que usar delay() es PECADO, ya que paramos completamente el micro, y si estamos comunicando 2 o más arduinos a saber lo que puede pasar, así que he usado millis()

No sé porqué el led RX del UNO no se enciende, el TX sí, puede ser problemas de la shield XBEE (¿?) ya que está enviando datos perfectamente sino no encendería el led en el leonardo.

En el Leonardo no se enciende ni RX ni TX, ésto es por usar Serial1 por lo que he leído (Serial queda reservado para comunicación con el usb)

Esto es lo que he subido al UNO (En el leonardo es todo igual, solo cambiando Serial por Serial1)

/* MANDA SERIE H's y L's 
RECIBE SERIE H's L's enciende leds
*/

const int ledPin =  13;
int incomingByte;// the number of the LED pin

unsigned long previousMillis = 0;
const long interval= 500;           //intervalo para mandar H y L
int bandera = 0; //inicializamos BANDERA=0 -> LED APAGADO;

void setup() {
  Serial.begin(9600);
  
  // set the digital pin as output:
  pinMode(ledPin, OUTPUT);      
}

void loop()

{
  unsigned long currentMillis = millis();
   
   //MANDAMOS H y L segun interval
  if(currentMillis - previousMillis >= interval){
    previousMillis= currentMillis;
    if(bandera == 1){
    Serial.print('H');
    bandera = 0;
    }
    else{
      Serial.print('L');
      bandera = 1;
     }
  }
  
  

  ////////////////LEEMOS SERIE////////////////
  
    if (Serial.available() > 0) {
    
      
    incomingByte = Serial.read();
   
    // if it's a capital H (ASCII 72), turn on the LED:
    if (incomingByte == 'L') {
      digitalWrite(ledPin, LOW);
    } 
    // if it's an L (ASCII 76) turn off the LED:
    if (incomingByte == 'H') {
      digitalWrite(ledPin, HIGH);
    }
  }
    
    
}

Y una duda: en un arduino hago que cuando reciba H se apague el led y con L se encienda, para que ambos leds se complementen (apagado-encendido). Pero veo que se solapan un poco, esto supongo que es debido a que no tienen sincronización usando serial. Podría mandarse millis() de uno a otro, para sincronizar el "reloj" de ambos arduinos (?)

Y por último lo que más problemas me trae es que no puedo usar el monitor serie del ide con el Leonardo, parece ser que usando Serial1 no se activan DTR y RTS (Y ni idea de como activarlo)

Lo siguiente es comunicar Leonardo al PC y usarlo como pasarela entre el UNO y PC pero antes quiero solucionar los problemas con el monitor y afianzar conocimientos.

Perdón por el tocho y a ver si alguien me podría ayudar con las dudillas/problemas. Un saludo!

Hola de nuevo Raulitus. En el post donde indico la configuración de los xbee, El código que expongo anteriormente es el encendido y apagado mediante xbee. Lo único que tienes que quitar el código que pertenece a GSM, porque yo lo realizo desde un smartphone y me funciona perfectamente.

http://forum.arduino.cc/index.php?topic=312193.0

CODIGO EN EL ROUTER/DEVICE AT:

//CONFIGURACIÓN DE LOS PINES.
int Led=13;  //numero pin led

//VARIABLES.
char ROrden;  //Guarda caracter recibido por el puerto Serial.

//////CONFIGURACIÓN//////
void setup() 
{ 
  Serial.begin(9600);  //Inicializamos la comunicación Serial.
  //Configuración de pines como entrada o salida.
  pinMode(Led,OUTPUT);//led como salida
}


void loop() 
{

  if(Serial.available()>0) //Testeo caracter entrada Serial.
  {
    ROrden=Serial.read();  //Guardo caracter entrante en marchaparo
    if(ROrden=='H')  // led apagado.
    {
      digitalWrite(Led,LOW); /////esto es lo que te falta!!!!!!!!!!!
      Serial.print('H');

    } 
    else if(ROrden=='L')  // led encendido
    {
       digitalWrite(Led,HIGH); //esto es lo que te falta!!!!!!!
       Serial.print('L');
    } 
    delay(10);
    Serial.read();//limpia buffle de lectura Serial.
  }
}

Saludos.