Comunicación serial entre dos arduinos

Buenas tardes, disculpen tengo que realizar un trabajo de la universidad basado en la comunicación serial entre dos arduinos este es el enunciado y tengo hecho la parte de transmisión, pero aun no tengo claro la parte del receptor. Alguien podría guiarme en la siguiente parte

Asi es como realice la parte del transmisor

void setup() {
  Serial.begin(57600);
  analogReference(EXTERNAL);
  DDRB=0b11111111;
  pinMode(activa,INPUT_PULLUP);

}

void loop() {
    if (digitalRead(activa)==HIGH&&aux==0){
      Setp=analogRead(Apin);
      dip=12;
      trama[0]= 255;
      trama[1]= Setp;
      trama[2]= dp;
      trama[3]= 254;
    for(int i=0;i<4;i++){
      Serial.write(trama[i]);
      delay(5);
    }
      if(var[0]==255&&var[3]==254){
        PORTB=var[2];
        var[0]=0;
      }
      delay(500);
    }else{
      if(aux==1){
        
      }
    }

}
void serialEvent(){
   dato=Serial.read();
   var[cont]=dato;
      cont++;
      aux=1;

      if(cont=4&&dato==254){
        cont=0;
        aux=0;
      }
}

He trasladado su tema de una categoría de idioma inglés del foro a la categoría International > Español @alevid28.

En adelante por favor usar la categoría apropiada a la lengua en que queráis publicar. Esto es importante para el uso responsable del foro, y esta explicado aquí la guía "How to get the best out of this forum".
Este guía contiene mucha información útil. Por favor leer.

De antemano, muchas gracias por cooperar.

Hi,
Adjunto un link que explica como conectar dos arduinos serial.La tutoria explica como prender un led apretando un switch en el otro arduino . Creo que te puede dar una idea de como hacerlo en tu projecto.

[Two arduino uart communication – Electronic Engineering Solutions]

Moderador:
Por favor, lee las Normas del foro
Si posteas en el foro en inglés usa idioma inglés para expresarte.
Si escribes en español debes usar el foro Arduino en español.

No me gusta el uso de serialEvent() pero no esta mal. Solo que no es de mi agrado. Nunca lo use´.
Al código le falta información de todas las variables globales lo que me hace frenar en mi análisis.
SI la información no esta completa no vale la pena estar adivinando.
Solo te diré que no haría trama como un array de enteros sino de bytes.
A Setp lo dividiría en highByte(Setp);y lowByte(Setp) para enviarlos.
Ahora usas 4 enteros o sea 8 bytes.
Del modo que te indico usarías 5 bytes. Ahorras 3, no es la gran cosa, y hasta no hace falta pero debes pensar en el modo que lo hacen los microcontroladores. A veces las cosas no sobran.
En el lado receptor, no deberías tener gran problema
En este hilo se resumen varias alternativas

En lugar de NO CARRIER usa tu 254 como marcador de fin.

Como a @Surbyte no me gusta usar serialEvent() y explico por qué.
Nuestros códigos al momento de compilar se "insertan" dentro del siguiente código (lo resumo)

int main() {
  setup();
  while (true) {
    loop();
    serialEvent();
  }
}

Como ves, serialEvent() es simplemente una función que se ejecuta a continuación de loop(), entonces nada impide incluir su código directamente dentro del mismo y obtener exactamente el mismo resultado.

Otra razón para no utilizarla es que los core de las nuevas placas ya no dan soporte a serialEvent(), por lo que se rompe la portabilidad del código.

Lo siento no vi que no lo subí con las variables globales, estas son las variables que declare

byte dp;
byte cont=0;
byte aux=0;
byte dip;
byte dato;
int Apin=A0;
int Setp;
int trama[4];
int var[4];
const byte activa=2;
int Setp;
int trama[4];

Setp = analogRead(Apin); // correcto
    
trama[1] = Setp;         // correcto
      
Serial.write(trama[i]);  // *** incorrecto ***

write() solo transfiere un byte y cada elemento de trama tiene dos bytes por ser tipo entero, al menos en el caso de Setp el valor se transfiere truncado (en realidad los 4 valores se truncan pero en el caso del inicio y fin de trama y dp, no "se nota" porque primero se transmite el byte bajo) .
Para transferir valores int (2 bytes) deberías usar (según tu código)

Serial.write(trama[i], 2);

Obviamente la recepción debe hacerse de a pares de bytes.

Otro detalle.
La trama tiene 4 datos (sean byte o int), comienza con 255 y termina con 254.
Pero veo un problema acá (aparte de que debería ser cont == 4)

if (cont = 4 && dato == 254) {  // error de sintaxis
  cont = 0;
  aux = 0;
}

¿Qué pasa si dato no contiene el valor 254?

No has previsto esa situación que va a provocar un error porque se excedería la longitud de trama al incrementarse cont en la próxima lectura.

Y si supones que nunca se puede dar la situación de que dato no contenga 254 entonces "sobra" la comparación dato == 254 porque siempre sería cierta.

En un instante apareció el problema detectado por @MaximoEsfuerzo pero yo estaba en la misma línea de detección. Es mas justamente te sugerí usar bytes o unsigned char que es lo mismo, para ahorrar datos, y justamente no tener problema en la recepción.

Moderador
@alevid28 , te das cuenta porque siempre se debe enviar todo el código!!
Lean las normas y revisen siempre lo que postean!!

Gracias cambie el serialEvent() por el available y ya me funcionó pero me pidieron agregar un botón que apague todo el sistema pero ahora cuando lo hago se me apaga la comunicación serial

#include <Arduino.h>

int motor = 3;  // Pin PWM para controlar el motor
int ledIndicator = 8; // LED indicador conectado aquí
int ledOther = 9;  // Otro LED
int switchPins[] = {4, 5, 6, 7}; // Dip switches

void setup() {
  pinMode(motor, OUTPUT);
  pinMode(ledIndicator, OUTPUT);
  pinMode(ledOther, OUTPUT);
  for (int i = 0; i < 4; i++) {
    pinMode(switchPins[i], INPUT_PULLUP);
  }
  Serial.begin(57600);
}

void loop() {
 if (int buttonState1= Serial.read() == LOW) {
  if (Serial.available() >= 5) {
    if (Serial.read() == 0x02) { // Byte de inicio
      int buttonState1= Serial.read();
      int motorSpeed = Serial.read();
    
      int ledIndicatorState = Serial.read() ;
      int ledOtherState = Serial.read() ;
      if (Serial.read() == 0x03) { // Byte final
        analogWrite(motor, motorSpeed);
        digitalWrite(ledIndicator, ledIndicatorState ? HIGH : LOW);
        digitalWrite(ledOther, ledOtherState ? HIGH : LOW);
        
        // Enviar de vuelta el estado de los interruptores DIP.
        Serial.write(0x04); // Byte de inicio para el estado del interruptor
        for (int i = 0; i < 4; i++) {
          Serial.write(digitalRead(switchPins[i]) + '0');
        }
        Serial.write(0x05); // Byte final para el estado del interruptor
      }
    }
  }
 }else {
  digitalWrite(motor,0);
    digitalWrite(ledIndicator,0);    
   digitalWrite(ledOther,0);
 }

}

Si apagas todo, claramente se va a cortar la comunicación.

Me refería a la transmisión de datos la comunicación debe quedar encendida para volver a iniciar de nuevo

Entendí apagar todo, incluso los arduinos, por eso te dije que claramente se corta la comunicación.

Si eso quise hacer al inicio pero lo que pasa es que solo se apaga la comunicación y los leds que quedaron encendidos por la transmisión de datos se quedan encendidos

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.