falla de instrucción en comunicacion serial

Hola buen día,

Tengo la siguiente duda, explicaré brevemente el funcionamiento de mi proyecto:

Para este proyecto es necesario dos arduinos donde al arduino principal le llamaremos maestro, y al otro arduino esclavo; el arduino maestro le envía un dato “A” al arduino esclavo y este al recibir el dato del arduino maestro le envía un dato de retorno “B”. Hasta aquí el código trabaja excelente, pero el arduino maestro tiene unas secuencias las cuales sirven para detectar si el arduino maestro recibió el dato que le mando el arduino esclavo, donde sería la siguiente lógica:

  • Si el arduino maestro SI recibe dato del arduno esclavo enciende (Led verde): digitalWrite(LedTestG,HIGH);

de lo contrario:

  • Si el arduino maestro NO recibe dato del arduno esclavo enciende (Led rojo): digitalWrite(LedTestB,HIGH);

El problema está que el LedTestB (Led rojo) no enciende cuando debería (cuando arduino maestro no recibe el dato)

les anexo los codigos que utilizo:

Código arduino "Esclavo"

#include <SoftwareSerial.h>

SoftwareSerial mySerial(14, 16);
const int LedOn = 10; 

int state;
int x;
void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);
  pinMode(LedOn, OUTPUT);
}

void loop() 
{
  if (Serial.available() > 0)
  {
    state = Serial.read();
    mySerial.write((byte) state);
  }
  
  if (mySerial.available() > 0) 
  {
    x = mySerial.read();
    Serial.write(x);
  }

  if(x == 'A')
  {
    mySerial.print('B');
    delay(2000);  
  }

Código arduino "Maestro"

#include <SoftwareSerial.h>

SoftwareSerial GPRS(14, 16);

const int LedOn = 9; 
const int LedTestG = 10;
const int LedTestB = 15; 
const byte BOn = 3;
const int BTest = 4;

bool estadoActual = false, estadoUltimo = false, contador = false;

int BSA = 0;
int state;
int x = 0;

void setup() 
{  
  pinMode(BOn, INPUT); 
  pinMode(BTest, INPUT);
  pinMode(LedOn, OUTPUT);
  pinMode(LedTestG, OUTPUT);
  pinMode(LedTestB, OUTPUT);
  
  Serial.begin(9600);
  GPRS.begin(9600);
}

void loop()
{ 
  estadoActual = digitalRead(BOn); 
  delay(50); 
  
  if (estadoActual && !estadoUltimo)
  {
    contador = !contador;  

    if (contador == 1)
    {
      digitalWrite(LedOn, HIGH);
      Serial.println("ON");     
    }
    
    else
    {
      digitalWrite(LedOn, LOW); 
      Serial.println("OFF");
    }
  }
  estadoUltimo = estadoActual;

  
  if (contador == 1)
    { 
      BSA = digitalRead(BTest);
      if (BSA == HIGH)
      {
        Comunicacion();
      }
    }
    else
    {
      digitalWrite(LedTestB, LOW);
      digitalWrite(LedTestG, LOW);
    }
}

void Comunicacion()
{   
  GPRS.print('A');
  
  while(GPRS.available() > 0) 
  {
    x = GPRS.read();

    digitalWrite(LedTestB, HIGH);
    
    if(x == 'B')
    {
      digitalWrite(LedTestG, HIGH);
      digitalWrite(LedTestB, LOW);
    }
  }  
}

Espero puedan ayudarme, donde cabe mencionar que digitalWrite(LedTestB, HIGH); lo puse fuera del ciclo while y aun así no funciono, de esta manera:

digitalWrite(LedTestB, HIGH);

while(GPRS.available() > 0) 
  {
    x = GPRS.read();
    
    if(x == 'B')
    {
      digitalWrite(LedTestG, HIGH);
      digitalWrite(LedTestB, LOW);
    }

Gracias y saludos

O sea que según tu comentario esto en el MAESTRO esta fallando

void Comunicacion() {   

  GPRS.print('A');
  
  while (GPRS.available() > 0) {
    x = GPRS.read();

    digitalWrite(LedTestB, HIGH);
    
    if (x == 'B') {
       digitalWrite(LedTestG, HIGH);
       digitalWrite(LedTestB, LOW);
    }
  }

Tal vez ocurra porque desde que envias 'A' no le das tiempo al esclavo a responder.
Agrega (Aunque no me gusta) un delay luego de enviar la 'A' y a ver si funciona

Yo lo haría de este modo

  if (contador == 1) { 
      BSA = digitalRead(BTest);
      if (BSA == HIGH)  {
          GPRS.print('A');
          while (Comunicacion() == 0);
      }
    }
    else  {
      digitalWrite(LedTestB, LOW);
      digitalWrite(LedTestG, LOW);
    }
}


bool Comunicacion() {   
    
  if (GPRS.available() > 0) {
    x = GPRS.read();

    digitalWrite(LedTestB, HIGH);
    
    if (x == 'B') {
       digitalWrite(LedTestG, HIGH);
       digitalWrite(LedTestB, LOW);
       return 1;
    }            
  }  
  return 0;
}

Gacias a todos :slight_smile: