Comunicazione seriale - nano opta

Buongiorno.
Sto cercando di realizzare una comunicazione seriale tra un Arduino NANO IOT (MASTER) ed un Arduino OPTA (slave). Il nano è collegato alla seriale dell'OPTA tramite un convertitore TTL-RS485.
La comunicazione funziona; riesco a vedere sul NANO i valori inviati dall'OPTA.
Il problema che trovo è il seguente. Nel momento in cui sconnetto il cavo di il collegamento tra i due Arduino, continuo a vedere i valori sul NANO per un tempo illimitato.
Noto inoltre che nel momento in cui sconnetto il cavo di collegamento tra i due Arduino, il LED D1 del convertitore TTL-RS485 inizia a lampeggiare in maniera opposta al pin D2 (pin che ho utilizzare per attivare la ricezione/Trasmissione). Se ripristino il collegamento il led D1 rimane sempre acceso.
Allego lo skecth del NANO-MASTER

////ARDUINO NANO MASTER////

int stato = 0;
int ib=0;
int aval;
uint8_t dati[3];   ////numero slave, comando e 0x00 di chiusura
uint8_t buff[6];
unsigned long t1;
unsigned long currentTime1;
unsigned long lastTime1;
unsigned long intervallo_5s=5*1000;


void setup() {
  /* Initialize serial and wait up to 3 seconds for port to open */
  Serial.begin(9600);
  for(unsigned long const serialBeginTime = millis(); !Serial && (millis() - serialBeginTime > 3000); ) { }
  Serial1.begin(4800);
  for(unsigned long const serialBeginTime = millis(); !Serial1 && (millis() - serialBeginTime > 3000); ) { }
  Serial.println("RS485 MASTER");

pinMode(2,OUTPUT);   ///PIN attivazione trasmissione/ricezione RS485
digitalWrite(2, LOW); 

}

  
void loop() {

delay(200);
switch(stato) {
    case 0:
      Serial.print("stato: ");
      Serial.println(stato);
      Serial.println("TX");
      digitalWrite(2, HIGH);  ///mi metto in trasmissione
      aval=Serial1.available();
     /// if (aval=0){   ////facciamo un'altra richiesta di dati all'OPTA dopo aver svuotato il buffer
      dati[0]=2;  ///numero slave
      dati[1]=1;  ///funzione 1=richiesta dati
      dati[2]=0;   ///serve per chiudere l'array
      Serial.print("trasmetto la richiesta dei dati allo slave n. "); Serial.println(dati[0]);
      Serial1.write(dati,sizeof(dati));
      delay(200);
      ///}
      stato = 1;
      t1=millis();
      break;
      
    case 1:
      leggo();
      break;
      } 
}

void leggo(){
      Serial.print("stato: ");
      Serial.println(stato);
      Serial.println("RX");
      digitalWrite(2, LOW);  ///mi metto in ricezione
      delay(200);
  
     
    if (Serial1.available()) {   ///se ci sono dati sulla seriale  

        for(ib=0;ib<6;ib++) {  
          buff[ib] = Serial1.read();
        }
      }
  

  for(ib=0;ib<6;ib++){
            if (buff[ib]==250 && buff[ib+1]==1){
            Serial.println("DATI RICEVUTI E CORRETTI");          
            Serial.print("SLAVE ID: "); Serial.println(buff[ib]);
            Serial.print("FC: "); Serial.println(buff[ib+1]);
            Serial.println(buff[ib+2]);
            Serial.println(buff[ib+3]);
            Serial.println(buff[ib+4]);
            Serial.println(buff[ib+5]);
            stato = 0;
            Serial.println("passo all'invio");
            break;
            }
          }
        
      if (millis()-t1>10000){
      stato=0;
      Serial.println("TIMEOUT:passo all'invio");

      } 
}

e quello dello slave OPTA:

#include <ArduinoRS485.h>

constexpr auto baudrate{ 4800 };

// Calculate preDelay and postDelay in microseconds for stable RS-485 transmission
constexpr auto bitduration{ 1.f / baudrate };
constexpr auto wordlen{ 9.6f };  // OR 10.0f depending on the channel configuration
constexpr auto preDelayBR{ bitduration * wordlen * 3.5f * 1e6 };
constexpr auto postDelayBR{ bitduration * wordlen * 3.5f * 1e6 };

int stato=0;
uint8_t dati[3];
uint8_t buff[6];
int ib = 0;


///float dataToSend= 3.14;
///byte*bytes = (byte*)&dataToSend;

void setup() {

    /* Initialize serial and wait up to 5 seconds for port to open */
  Serial.begin(9600);
  for(unsigned long const serialBeginTime = millis(); !Serial && (millis() - serialBeginTime > 5000); ) { }

  RS485.begin(baudrate);
  RS485.setDelays(preDelayBR, postDelayBR);
  delay(1500);
}

void loop() {
delay(500);
  switch(stato) {
    case 0:
    delay(100);
    Serial.print("stato: ");
    Serial.println(stato);
    Serial.println("RX");
    RS485.receive();
    if (RS485.available()) {   
    for(ib=0;ib<6;ib++) {
    dati[ib] = RS485.read();
    }
  

     for(ib=0;ib<6;ib++) {
        if (dati[ib] == 2 && dati[ib+1] == 1){
    
          Serial.print(dati[ib]);
          Serial.print("-");
          Serial.print(dati[ib+1]);
          Serial.print("-");
          Serial.println(dati[ib+2]);      
          stato = 1;
          RS485.noReceive(); 
          break;
        }
      }
    }
    break;
    
    case 1:
    
    Serial.print("ricevuta la richiesta dal master di leggere i valori dello slave n. "); Serial.println(dati[0]);
    RS485.beginTransmission();
    digitalWrite(LED_BUILTIN,HIGH);
    Serial.print("stato: ");
    Serial.println(stato);
    Serial.println("TX: ");
    delay(200);
    buff[0]=250;  ///n. slave
    buff[1]=1;  ///n. funzione richiesta
    buff[2]=80;
    buff[3]=60;
    buff[4]=40;
    buff[5]=20;
    RS485.write(buff,sizeof(buff));
    Serial.println(buff[0]);
    Serial.println(buff[1]);
    Serial.println(buff[2]);
    Serial.println(buff[3]);
    Serial.println(buff[4]);
    Serial.println(buff[5]);

    ///RS485.write(bytes,sizeof(float));
    
    delay(200);
    RS485.endTransmission();
    digitalWrite(LED_BUILTIN,LOW);
    stato = 0;
    delay(500);
    break;
  } 
}

Grazie.

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