RS485

Salve a tutti,
avrei un problema con la comunicazione mediante modbus-rtu 485.

In pratica ho un dispositivo con la rs485 nativa che attende dal mio arduino una richiesta per rispondere con il peso di una cella di carico.

Dopo aver acquistato il modulo ttl-rs485 ed eseguito le connessioni, ho scritto il codice che posterò qui sotto. Da manuale mi chiede di inviare per la lettura di alcuni registri i seguenti valori in esadecimale
h01 h03 h00 h07 h00 h04 hF5 hc8
il dispositivo dovrebbe rispondermi con un'altra stringa, ma in realtà non mi risponde affatto.
Premetto che sono neofita con questo protocollo, quindi mi appello alla vostra gentilezza.

int command = 2;
int i = 0; 


void setup() {
 Serial3.begin (9600);
 Serial.begin (9600);
 pinMode(command, OUTPUT);

}

void loop() {
digitalWrite(command, HIGH); //TX

for (i=0; i<8; i++)
{
  switch(i) {
       case 0 : Serial3.print(01,HEX);break;
       case 1 : Serial3.print(03,HEX);break;
       case 2 : Serial3.print(00,HEX);break;
       case 3 : Serial3.print(07,HEX);break;
       case 4 : Serial3.print(00,HEX);break;
       case 5 : Serial3.print(04,HEX);break;
       case 6 : Serial3.print(245,HEX);break;
       case 7 : Serial3.print(200,HEX);break;

             }
             delay(500);
}

digitalWrite(command,LOW);//RX


while(Serial3.available()>0)
 {
   Serial.println(Serial3.read());
   
   }
 
}

Intanto metti il codice tra gli appositi tag. Poi, invece delle varie:

Serial3.print(01,HEX)

Prova:

Serial3.write(0x01);

Puoi anche mettere le write() una dietro l'altra, senza quel for/switch.

Ti ringrazio per la risposta.
Purtroppo non cambia nulla. Il problema persiste. in ricezione ho sempre il solito -1 che mi indica nessun dato disponibile sul bus

Posta lo sketch aggiornato.

Ecco il codice

int command = 2;
int i = 0; 


void setup() {
  Serial3.begin (9600);
  Serial.begin (9600);
  pinMode(command, OUTPUT);

}

void loop() {
digitalWrite(command, HIGH); //TX
       

 Serial3.write(0x01);
 Serial3.write(0x03);
 Serial3.write(0x00);
 Serial3.write(0x07);
 Serial3.write(0x00);
 Serial3.write(0x04);
 Serial3.write(0xF5);
 Serial3.write(0xC8);
 
 delay(1000);

digitalWrite(command,LOW);//RX

Serial.println(Serial3.read()); //solo per vedere se restituisce un valore diverso da -1

while(Serial3.available()>0)
  {
    Serial.println("prova");
    Serial.println(Serial3.read());
    
    }
  
}

Ciao
Dopo che hai finito di trasmettere attendi un secondo prima di mettere in ricezione l'rs485. Non è che il dispositivo risponde mentre non sei in ricezione?

Ciao
pippo72

**>bk013: ** NON avendolo tu ancora fatto, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con MOLTA attenzione il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

Ero convinto di essermi già presentato in precedenza. Chiedo scusa, provvedo subito :slight_smile:

Pippo72 credo che la trasmissione non avvenga a questo punto perché noto che i led relativi non si accendono quando dovrebbero. Si accende solo rx quando mi deve rispondere -1

Sì, ma tu:
Invii la stringa
Aspetti un secondo
Passi in ricezione
Leggi sempre e comunque un carattere
Se non c'è niente da leggere ripeti da capo

Non mi sembra un metodo molto funzionale, dovresti invece:
Inviare la stringa
Passare in ricezione
Accodare in un buffer quel che ricevi finché la risposta non è completa oppure scade un timeout

grazie SukkoPera, credo di aver risolto. In realtà ho cambiato modalità di trasmissione dati della bilancia e invece di aspettare in comando di lettura (e credo che fosse quello a non funzionare bene perchè di risposta non se ne parlava neanche) ho impostato la trasmissione in modalità invio continuo (devo controllare in tempo reale le variazioni quindi mi arrivano dati senza interrogazioni e recupero anche sui tempi).
Adesso sembra andare anche se devo scrivere un pò di codice per convertire da ascii a decimale i valori che mi arrivano. In ogni caso ho seguito il tuo consiglio di mettere tutto in un vettore fin quando non ha terminato l'invio ed è tutto più pulito. :slight_smile: