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());
}
}
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
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?
**>bk013: ** NON avendolo tu ancora fatto, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentartiIN 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.
Ero convinto di essermi già presentato in precedenza. Chiedo scusa, provvedo subito
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.