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.