1

Topic: Communication errors

Hi !
I have this configuration:

MEGA 2560 + HC05 at 9600 Baud + Arduino IDE

I try the communication but 90/100 times, when it received the GUI configuration,  it respond "read timeout error"; sometimes it can receive the GUI configuration but it go to crash when send the variables, and in the rare cases when it work, the app stop after some seconds with "disconnected"....

Can you help me?

Paolo

2

Re: Communication errors

Do you use source code from editor without your additional code? Can you share you cketch code?

3

Re: Communication errors

Yes of course. The code is for an open source instrument, that is built for a thesis. MCU is an Arduino MEGA 2560.
Excuse me for italianism and thank you in advance for your help

Paolo


//
// RemoteXY select connection mode and include library
#define REMOTEXY_MODE__HARDSERIAL

#include <RemoteXY.h>

// RemoteXY connection settings
#define REMOTEXY_SERIAL Serial3
#define REMOTEXY_SERIAL_SPEED 9600

#include <SPI.h>
#include <SD.h>
#include "SparkFun_MMA8452Q.h"    // Click here to get the library: http://librarymanager/All#SparkFun_MMA8452Q
#include <Wire.h>                 // Must include Wire library for I2C
MMA8452Q accel;                   // create instance of the MMA8452 class


// RemoteXY configurate 
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =
  { 255,83,0,23,0,30,3,15,0,4,
  130,1,2,1,94,49,2,27,130,1,
  56,1,41,22,1,29,130,1,1,1,
  53,22,1,29,1,1,66,39,20,5,
  1,14,24,83,84,65,82,84,0,66,
  0,59,28,4,25,1,31,26,66,131,
  76,2,15,9,1,1,24,67,4,66,
  28,20,6,1,31,26,11,68,33,1,
  27,53,22,1,8,36,67,111,117,110,
  116,115,0,131,0,25,53,20,6,1,
  206,24,83,67,65,78,0,131,1,3,
  53,20,6,2,206,24,83,69,84,0,
  70,16,38,9,4,4,2,26,134,0,
  70,16,38,16,4,4,2,26,134,0,
  70,16,38,23,4,4,2,26,37,0,
  70,16,38,31,4,4,2,26,37,0,
  7,36,2,2,26,3,1,0,26,29,
  11,7,36,2,9,12,3,1,0,26,
  29,11,7,36,2,16,12,3,1,0,
  26,29,11,7,36,16,9,12,3,1,
  0,26,29,11,7,36,16,16,12,3,
  1,0,26,29,11,129,0,30,3,10,
  2,1,24,70,73,76,69,78,65,77,
  69,0,129,0,30,10,16,2,1,24,
  50,32,84,72,69,84,65,32,82,65,
  78,71,69,0,129,0,30,17,23,2,
  1,24,83,84,69,80,32,83,73,90,
  69,32,38,32,84,73,77,69,32,83,
  73,90,69,0,129,0,2,13,13,2,
  1,24,50,32,84,104,32,194,176,32,
  83,84,65,82,84,0,129,0,16,13,
  11,2,1,24,50,32,84,104,32,194,
  176,32,83,84,79,80,0,129,0,2,
  20,13,2,1,24,83,84,69,80,32,
  83,73,90,69,0,129,0,16,20,13,
  2,1,24,84,73,77,69,32,83,73,
  90,69,0,10,53,58,9,15,6,1,
  14,134,24,82,88,32,79,78,0,31,
  82,88,32,79,70,70,0,66,131,76,
  13,15,9,1,1,24,129,0,92,6,
  3,2,1,24,75,86,0,129,0,92,
  15,3,2,1,24,109,65,0,129,0,
  59,25,4,2,1,24,67,112,115,0,
  129,0,68,25,9,2,1,24,50,32,
  116,104,101,116,97,32,40,194,176,41,
  0,7,36,46,23,14,4,2,0,26,
  29,11,7,36,46,31,14,4,2,0,
  26,29,11,129,0,61,24,11,2,2,
  24,82,88,45,50,84,194,176,32,115,
  116,111,112,0,129,0,61,32,11,2,
  2,24,68,88,45,50,84,194,176,32,
  115,116,111,112,0,1,1,66,48,20,
  5,1,14,31,101,109,101,114,103,101,
  110,99,121,32,115,116,111,112,0,1,
  1,44,2,9,4,1,14,24,83,69,
  78,68,0,129,0,31,20,20,2,1,
  24,32,120,32,48,46,48,48,52,53,
  194,176,32,32,32,32,32,32,32,32,
  32,32,105,110,32,109,83,0,3,5,
  4,7,8,37,2,178,201,129,0,14,
  10,23,2,2,24,90,69,82,79,32,
  50,32,116,104,101,116,97,32,45,32,
  82,88,32,84,117,98,101,0,129,0,
  14,17,23,2,2,24,90,69,82,79,
  32,50,32,116,104,101,116,97,32,45,
  32,68,101,116,101,99,116,111,114,0,
  129,0,14,24,19,2,2,24,82,88,
  32,84,117,98,101,32,112,111,115,105,
  116,105,111,110,105,110,103,0,129,0,
  14,32,20,2,2,24,68,101,116,101,
  99,116,111,114,32,112,111,115,105,116,
  105,111,110,105,110,103,0,129,0,14,
  39,22,2,2,24,83,97,109,112,108,
  101,32,109,111,116,111,114,32,79,78,
  47,79,70,70,0,70,16,38,38,4,
  4,2,26,37,0,10,48,79,22,12,
  12,2,132,26,31,65,108,108,111,119,
  0,31,79,70,70,0,129,0,59,55,
  30,3,0,200,105,45,88,69,83,32,
  120,32,114,97,121,32,109,101,97,115,
  117,114,101,115,0 };
 
// this structure defines all the variables and events of your control interface
struct {

    // input variables
 
 
  float edit_1;  //   angolo posizione rx float
  float edit_2;  //  angolo posizione dx float
  char edit_5[12];  // string UTF8 end zero  filename char 12 caratteri compresi gli spazi
  float edit_6;  //   2 th ini float
  float edit_7;  //   2 th fin float
  int edit_8;  //  step int
  int edit_9;  //   time int
 
  uint8_t pushSwitch_1; // =1 if state is ON, else =0 RX ON OFF
  uint8_t pushSwitch_2; // =1 if state is ON, else =0 ALLOW COMMAND

  uint8_t button_5; // =1 if button pressed, else =0
  uint8_t button_6; // =1 if button pressed, else =0
  uint8_t button_7; // =1 if button pressed, else =0
 
  uint8_t select_1; // =0 if select position A, =1 if position B, =2 if position C, ...
 
    // output variables

  int8_t level_1; // =0..100 level position KV 0 - 40
  int8_t level_2; // =0..100 level position mA 0 - 0.1
  int8_t level_3; // =0..100 level position COUNTS
   
  float text_1;  //  testo dato angolo 2 theta scansione
  float onlineGraph_1_var1; // CONTEGGI
 
  uint8_t led_1; // led state 0 .. 1 LED ZERO RX
  uint8_t led_2; // led state 0 .. 1 LED ZERO DX
  uint8_t led_3; // led state 0 .. 1 LED POS RX
  uint8_t led_4; // led state 0 .. 1 LED POS DX
  uint8_t led_5; // led state 0 .. 1 LED MOTOR ON OFF

    // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0

} RemoteXY;
#pragma pack(pop)
 
/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////

#define PIN_BUTTON_5 7 // - ridefinire il pin 13

// MOTORE SX
#define dirPin 37
#define stepPin 41
#define enaPin 39

// MOTORE DX
#define dir2Pin 25
#define step2Pin 23
#define ena2Pin 27

// RX CONTROL
#define FILRY 29
#define HV 28
#define VENT 11 //modificato a 11

// SD CARD
#define MOSI 51//blu
#define MISO 50//viola
#define SCK 52//grigio
#define CS 53 //verde
// nero + bianco, massa

// Sensore angolare MMA8452Q
#define SCL 21 // viola
#define SDA 20 // grigioù

// MOTORE AUSILIARIO
#define MOTOR 12//modificato a 12

//SWITCH FINE CORSA
#define SW1SX0 33 // FINE CORSA SINISTRA 0 GRADI
#define SW2DX0 35  // FINE CORSA DESTRA 0 GRADI
// ricorda nello slave A8 corrente A10 tensione da HV

// LED GRB CUPOLA

#define LEDR 10 // LED ROSSI PER RX ON sulla cupola
#define LEDG 8 // LED VERDE cupola
#define LEDB 9 // LED BLU cupola//ex48


// SWITCH CUPOLA
#define SW3C 42 // SWITCH CUPOLA OK/OFF

// INDICATORI

#define LED1 13 // LED BLU SX
#define LED2 49 // LED RED RX ON
#define LED3 47 // led ORANGE
#define LED4 45 // led YELLOW
#define LED5 43 // led GREEN
#define LED6 31 // led BLU DX


// dichiarazione file
File myFile;
// Dichiarazione variabili
int i=0;
int idx = 0;
int isx=0;
int icx=0;
int r=0;

int ireal = 0;
int izero=0;
int novstep = 0;
float zeronovanta =0;
float anginizio=0;
int stepinizio =0;
float angfine =0;
int stepfine = 0;
int stini=0;
int stfine=0;
int val=0;
int v0=0;
int count1 = 0;
int count2=0;
int st=0;
int amin=0;
int amax=0;
int ascan = 0;
float angreach=0;
// procedura di smoothing del dato prima che venga plottato

const int numReadings = 3;
int readings[numReadings];      // the readings from the analog input
int readIndex = 0;              // the index of the current reading
int total = 0;                  // the running total
int average = 0;                // the average
int count[numReadings];

//

void setup()
{
  RemoteXY_Init ();
 
  pinMode (PIN_BUTTON_5, OUTPUT);
 
  // TODO you setup code
  Serial.begin(9600);
  //Serial2.begin(9600);
  Wire.begin();

// initialize all the readings to 0:
  for (int thisReading = 0; thisReading < numReadings; thisReading++) {
    readings[thisReading] = 0;
  }

// inizializza pin digitali

  // MOTORE SX
  pinMode(stepPin, OUTPUT); // motore 1
  pinMode(dirPin, OUTPUT); // motore 1
  pinMode(enaPin,OUTPUT); // motore 1

  // MOTORE DX

  pinMode(step2Pin, OUTPUT);
  pinMode(dir2Pin, OUTPUT);
  pinMode(ena2Pin, OUTPUT);
 
// SWITCH FINE CORSA
  pinMode(SW1SX0,INPUT);  // 0 GRADI SINISTRO
  pinMode(SW2DX0, INPUT); // 0 GRADI DESTRO
// pinMode(SW1SX90, INPUT);// 90 gradi sinistro
// pinMode(SW2DX90, INPUT);// 90 gradi destro

// LED CUPOLA
pinMode(LEDR, OUTPUT); // RX ON e accendi di rosso la cupola
pinMode(LEDG, OUTPUT); // LED Green per il bianco cupola
pinMode(LEDB, OUTPUT); //LED Blue per il bianco cupola
// NB per avere il bianco li devi accendere tutti e tre

// SWITCH cupola
pinMode(SW3C, INPUT); // segnala la cupola chiusa

// LED SEGNALAZIONI VARIE 
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(LED4, OUTPUT);
pinMode(LED5, OUTPUT);
pinMode(LED6, OUTPUT);

  // RAGGI X
pinMode(HV, OUTPUT);// abilitazione HV
pinMode(VENT, OUTPUT);// abilita ventola
pinMode(MOTOR, OUTPUT);// abilita il motore sample attraverso il MOSFET
//pinMode(FILRY, INPUT);// consente di accendere la tensione ma non prima che il filamento sia acceso

float HVV=0;
float ICC=0;

// INITIALIZE

//prova LED
// inizia test led

//digitalWrite(LEDRX, HIGH);
//delay(500);
digitalWrite(LED6, HIGH);
delay(250);
digitalWrite(LED5, HIGH);
delay(250);
digitalWrite(LED4, HIGH);
delay(250);
digitalWrite(LED3, HIGH);
delay(250);
digitalWrite(LED2, HIGH);
delay(250);
digitalWrite(LED1, HIGH);
// FINE TEST LED
//digitalWrite(LEDRX, LOW);
delay(250);
digitalWrite(LED6, LOW);
delay(250);
digitalWrite(LED5, LOW);
delay(250);
digitalWrite(LED4, LOW);
delay(250);
digitalWrite(LED3, LOW);
delay(250);
digitalWrite(LED2, LOW);
delay(250);
digitalWrite(LED1, LOW);
delay(250);
digitalWrite(LED1, HIGH);// spia on accesa


    //ACCENDE LE VENTOLE

digitalWrite(VENT, HIGH);
delay(100);

// PROVA LA CUPOLA
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, HIGH);
delay(550);
digitalWrite(LEDR, LOW);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, LOW);
delay(550);
digitalWrite(LEDR,  LOW);
digitalWrite(LEDG, LOW);
digitalWrite(LEDB, HIGH);
delay(550);
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, LOW);
digitalWrite(LEDB, LOW);
delay(550);
digitalWrite(LEDR, HIGH);
digitalWrite(LEDG, HIGH);
digitalWrite(LEDB, HIGH);
}

void loop() {
 

RemoteXY_Handler ();
 
  digitalWrite(PIN_BUTTON_5, (RemoteXY.button_5==0)?LOW:HIGH);
 
  // QUI POTREMMO METTERE IL CODICE DI AVVIO DEL PROGRAMMA DI GESTIONE
  // TODO you loop code
  // use the RemoteXY structure for data transfer
  // do not call delay()
int sstep=0;
float angmin=0;
float angmax=0;
int times=0;
int numReadings=0;
Menus();
if(RemoteXY.pushSwitch_1!=0){
  RXON();
}
if(RemoteXY.pushSwitch_1!=1){
  RXOFF();
}
}
// SUBROUTINES VOID


void Menus() {
switch (RemoteXY.select_1){

            case 0: zerotuboRX();break;
            case 1: zerodetector();break;
            case 2: posizionatuboSX(); break;
            case 3: posizionadeteDX(); break;
            if(RemoteXY.select_1==4){
              Motoron();
            }else Motoroff();
           
            //default: continue;  // includes the case 'no input'
           
}}

           void zerotuboRX(){
        if(RemoteXY.pushSwitch_2!=0){
digitalWrite(enaPin,LOW);
digitalWrite(dirPin, LOW);// il motore SX va alla posizione di zero (gira a sinistra)
  for(i=0;i< 22000;i++){
  digitalWrite(stepPin,LOW);
  delayMicroseconds(500);
  digitalWrite(stepPin, HIGH);
  delayMicroseconds(500);
  delay(0.1);
  if(digitalRead(SW1SX0)==HIGH){
  digitalWrite(LED6, HIGH);
  i=22000;
  }}}else {
       
  }}
 
          void zerodetector(){
        if(RemoteXY.pushSwitch_2!=0){
digitalWrite(ena2Pin,LOW);
digitalWrite(dir2Pin, LOW);// // il motore DX va alla posizione di zero (gira a sinistra)
for(i=0;i< 22000;i++){
  digitalWrite(step2Pin,LOW);
  delayMicroseconds(500);
  digitalWrite(step2Pin, HIGH);
  delayMicroseconds(500);
  delay(0.1);
//Serial.println(i);
isx=i;
if(digitalRead(SW2DX0)==HIGH){
  digitalWrite(LED5, HIGH);
i=22000;
}}}else {
       
}}

        void posizionatuboSX() {
        if(RemoteXY.pushSwitch_2!=0){
        float angolosx;         
        zerotuboRX();       
digitalWrite(enaPin,LOW);
digitalWrite(dirPin, HIGH);// il motore SX gira a destra
//Serial.println("");
//Serial.println(" Angolo di posizionamento del tubo: ");
//   while (!Serial.available()) {;}
//    float angolosx = Serial.parseFloat();
//    Serial.print(" --->  ");
//    Serial.println(angolosx);
  int amminsx= abs(angolosx*0.5/(0.0045));
  for(int r=0;r< amminsx;r++){   
    digitalWrite(stepPin,LOW);
    delayMicroseconds(500);
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(500);
    delay(0.1);
   }
  r=0;
}else {
       
}}

        void posizionadeteDX() {
          if(RemoteXY.pushSwitch_2!=0){
        float angolodx;         
        zerodetector();
  digitalWrite(ena2Pin,LOW);
  digitalWrite(dir2Pin, HIGH);// il motore SX gira a destra

  //  Serial.println(" Angolo di posizionamento del detector: ");
  //  while (!Serial.available()) {;}
  //  float angolodx = Serial.parseFloat();
  //  Serial.print(" --->  ");
  //  Serial.println(angolodx);

int ammindx=abs(angolodx*0.5/(0.0045));
for (r=0;r<ammindx;r++){
  digitalWrite(step2Pin,LOW);
  delayMicroseconds(500);
  digitalWrite(step2Pin, HIGH);
  delayMicroseconds(500);
  delay(0.1);
}
r=0;
}}

            void SECUR(){
              if(digitalRead(SW3C)==HIGH){
              digitalWrite(LED5, HIGH);
              digitalWrite(LED4, LOW);
            }
              if(digitalRead(SW3C)==LOW){
              digitalWrite(LED5, LOW);
              digitalWrite(LED4, HIGH);
             }
            }

            void LEDRON(){
              // serve ad accendere di rosso la cupola
              digitalWrite(LEDG, LOW);
              digitalWrite(LEDB, LOW);
              digitalWrite(LEDR, HIGH);
            }

            void LEDROFF(){
              // serve a spegnere il rosso alla cupola
              digitalWrite(LEDG, HIGH);
              digitalWrite(LEDB, HIGH);
              digitalWrite(LEDR, HIGH);
            }
           
           

            void Deleteparam(){
             
  Serial.println(" Cancellazione file dei parametri ..");
  SD.remove("PARAM.txt");
  if(SD.exists("PARAM.txt")){
    Serial.println(" File PARAM.txt esistente");
  }else{
    Serial.println(" File PARAM.txt non esistente");
  }
}
           void Motoron(){
             if(RemoteXY.pushSwitch_2!=0){
  digitalWrite(MOTOR, HIGH);
  digitalWrite(LED3,HIGH);
}}

           void Motoroff(){
            if(RemoteXY.pushSwitch_2!=1){
  digitalWrite(MOTOR, LOW);
  digitalWrite(LED3,LOW);
}}


          void RXON(){
delay(1000);
digitalWrite(HV, HIGH);// da consenso ad HV
digitalWrite(LED2, HIGH);
}
          void RXOFF(){
delay(1000);
digitalWrite(HV, LOW);// toglie consenso ad HV
digitalWrite(LED2, LOW);
//LEDROFF();
delay(2500);
}

        void SCANDXRX(){

String id;

// inserire dati se non presenti
zerotuboRX(); // richiama routine trova zero sinistro
zerodetector(); // richiama routine trovazero destro
id = (RemoteXY.edit_5);
float angmin=(RemoteXY.edit_6);
float angmax=(RemoteXY.edit_7);
int sstep=(RemoteXY.edit_8);
int period=(RemoteXY.edit_9);

myFile = SD.open(id, FILE_WRITE);
amin=abs((angmin*0.5)/(0.0045*sstep));// nuova configurazione
amax=abs((angmax*0.5)/(0.0045*sstep));// nuova cnfigurazione, con step da 0.0045° (800 step/giro demoltiplicato per 100)
ascan=amax-amin;// step da "sstep" da percorrere

// routine per attendere l'inserimento del portacampione, senza e con switch aperto non si parte

  int i=0;

  int inputPin = A6;
digitalWrite(LED2, LOW);
digitalWrite(LED3, LOW);
digitalWrite(LED4, LOW);
digitalWrite(LED5, LOW);
digitalWrite(LED6, LOW);
//posiziona tubo angmin

int ammin=abs((angmin*0.5)/0.0045);
digitalWrite(enaPin,LOW);
digitalWrite(dirPin,HIGH);// il motore SX va a destra
for(i=0;i< ammin;i++){
  digitalWrite(stepPin,LOW);
  delayMicroseconds(500);
  digitalWrite(stepPin, HIGH);
  delayMicroseconds(500);
  delay(0.1);
}
digitalWrite(LED6, HIGH);
delay(150);

// raggiunta la posizione di tubo theta 1

//posiziona detector angmin
digitalWrite(ena2Pin,LOW);
digitalWrite(dir2Pin,HIGH);// il motore DX va a destra
for(i=0;i< ammin;i++){
  digitalWrite(step2Pin,LOW);
  delayMicroseconds(500);
  digitalWrite(step2Pin, HIGH);
  delayMicroseconds(500);
  delay(0.1);
  }
digitalWrite(LED5, HIGH);
delay(150);
// raggiunta la posizione di detector theta 1

RXON();// accendi i raggi
digitalWrite(LED2, HIGH);
LEDRON();

// INIZIA SCANSIONE

int countka=0;
int countkb=0;
int counttot=0;
for(st=0;st<ascan;st++){

digitalWrite(LED4, HIGH);
digitalWrite(LED3, LOW);
digitalWrite(LED5, HIGH);

    for(i=0;i<sstep;i++){
      digitalWrite(stepPin,HIGH);
      delayMicroseconds(500);
      digitalWrite(stepPin, LOW);
      delayMicroseconds(500);
      delay(0.1);     
      }
    for(i=0;i<sstep;i++){
      digitalWrite(step2Pin,HIGH);
      delayMicroseconds(500);
      digitalWrite(step2Pin, LOW);
      delayMicroseconds(500);
      delay(0.1);     
      } 
// routine lettura contatore

for (i=0;i<period;i++){

int V=analogRead(A6);
int tensione=map(V,0,1023,0,5000);// qui si impostano le finestre di lettura delle ampiezze degli impulsi

    if (tensione>100&&tensione<1100){
countka=countka+1;// m ka
}
    if (tensione>1100&&tensione<1300){
countkb=countkb+1;// n kb
}
counttot=countka-countkb;
// o conteggi totali ka - kb

}
  int readold=average;;
  int error=0;
 
float angreach=st*sstep*0.0045;
float angolorag=angmin+angreach*2;

RemoteXY.onlineGraph_1_var1=(float)(countka)/(period);
//Serial.print("   ");
RemoteXY.level_3=(int)abs((counttot/period));
// qui inseriamo la registrazione dei dati (angolo, counts) su SD card
myFile.println("  ");
myFile.print(angolorag, 4);
myFile.print("   ");
myFile.print(countka);
myFile.print("  ");
countka=0;
countkb=0;
counttot=0;
digitalWrite(LED4, LOW);
digitalWrite(LED3, HIGH);
digitalWrite(LED5, LOW);
digitalWrite(LED6, HIGH);
delay(200);
}

myFile.close();// si chiude il file dati
/// inserire routine di spegnimento e ritorno a zero
// routine spegnimento raggi e rotazione motore
RXOFF();
LEDROFF();
//digitalWrite(HV, LOW);
digitalWrite(LED2, LOW);
Motoroff();
// routine ritorno a zero tubo
digitalWrite(enaPin,LOW);
digitalWrite(dirPin, LOW);// il motore SX va alla posizione di zero (gira a sinistra)
  for(i=0;i< 22000;i++){
  digitalWrite(stepPin,LOW);
  delayMicroseconds(500);
  digitalWrite(stepPin, HIGH);
  delayMicroseconds(500);
  delay(0.1);
      if(digitalRead(SW1SX0)==HIGH){
      digitalWrite(LED6, HIGH);
      i=22000;
      }
  }
// routine ritorno a zero tubo
digitalWrite(ena2Pin,LOW);
digitalWrite(dir2Pin, LOW);// // il motore DX va alla posizione di zero (gira a sinistra)
for(i=0;i< 22000;i++){
  digitalWrite(step2Pin,LOW);
  delayMicroseconds(500);
  digitalWrite(step2Pin, HIGH);
  delayMicroseconds(500);
  delay(0.1);
//Serial.println(i);
isx=i;
if(digitalRead(SW2DX0)==HIGH){
  digitalWrite(LED5, HIGH);
i=22000;
}}}

4

Re: Communication errors

Ouch. This code uses a lot of delay functions.
The RemoteXY_Handler() not called at least every 100ms or more often.
Your code should ensure that the RemoteXY_Handler() function is called as often as possible so that it can process requests from the application and ensure data transfer.

5

Re: Communication errors

you can replace the delay () function with the following:

void delayRXY (uint32_t ms) {
  uint32_t t = millis ();
  while (millis () - t < ms) RemoteXY_Handler ();
}

//delay(250);  // not use
delayRXY(250);

but still some things in your code can cause big delays

6

Re: Communication errors

Welcome smile

Please use code tags (the "<>" icon) around your code so its formatted and we dont need to scroll.

Replace all time-consuming for-loops, while-loops, and delay(), with so-called "finite state machines" using millis() for timing as demonstrated in the "Blink Without Delay" example. Learn to write non-blocking code, it's the only way to make a program that is responsive instead of wasting most of its time doing nothing but twiddling its thumbs smile

7

Re: Communication errors

TThank you for your suggest, today I'll tested the code with this improvement.