#include <HardwareSerial.h>

// This example made serial2 the sender and serial1 the receiver

// example struct
struct joystick_data {
  byte x1, x2, x3, x4;
} sender, receiver;

void sendData() {
  byte dataSend[sizeof(sender)];
  memcpy(dataSend, &sender, sizeof(sender));
  Serial2.write(dataSend, sizeof(dataSend));
}

void setup() {
  Serial.begin(115200);
  Serial2.begin(115200);

  for (int i = 0; i < 10; i++) {
    // sending
    sender.x1 = 10+i;
    sender.x2 = 20+i;
    sender.x3 = 30+i;
    sender.x4 = 40+i;
    sendData();
  }
} 

void loop() {
  // trying to receive
  if (Serial.available() >= sizeof(receiver)) {
    // receive byte + decode
    byte dataReceive[sizeof(receiver)];
    Serial.readBytes(dataReceive, sizeof(dataReceive));
    memcpy(&receiver, dataReceive, sizeof(dataReceive));

    // print result
    Serial.println(receiver.x1);
    Serial.println(receiver.x2);
    Serial.println(receiver.x3);
    Serial.println(receiver.x4);
  }
  delay(10);
}