Eccomi qui per una nuova ricerca di aiuto.
Sto leggendo con Arduino, senza problemi, un segnale da un PLC su RS-485.
Per leggerlo ho usato la classica schedina con il MAX collegata direttamente sulla breadboard, pin to pin, con un NANO. I pin sono D12 - d11 - d10 - D9 rispettivamente per RO - RE - DE - DI.
Ho fatto così perchè se ci metto dei fili ricevo dei disturbi che invece così non ricevo.
#include <SoftwareSerial.h>
SoftwareSerial rs485 (12, 9);
float inputplc = 0;
void setup () {
Serial.begin (9600);
rs485.begin (4800);
pinMode (11, OUTPUT); // pin Data Enable
pinMode (10, OUTPUT); // pin Data Enable
digitalWrite (11, LOW); // ricezione
digitalWrite (10, LOW); // ricezione
}
void loop () {
if (rs485.available ()) {
inputplc = rs485.read ();
if (inputplc == 32) {
Serial.println (" ");
}
else Serial.print (inputplc);
// delay (10);
}
}
Il problema non è qui, ma nella INTERPRETAZIONE DEI DATI...
Trasmetto a 16 bytes e dopo ogni dato metto un H20 (a capo) almeno nel monitor ci capisco qualcosa.
Però arduino interpreta (giustamente) diversamente a seconda del tipo di variabile.
Con una INT (16 bytes) i valori non sono corretti perchè mi da:
010 per 1
020 per 2
0100 per 10
01000 per 100
ma veniamo al fatidico 256
02550 per 255
001 per 256
Da qui si capisce che un byte è andato a ZERO mentre l'altro byte è stato incrementato di 1.
Potrei prendere l'ultimo carattere per capire la cifra, ma non è così facile perchè
0110 potrebbe essere 11 ma potrebbe essere anche 1+(256*10) cioè 2561
Allora ho provato diverse combinazioni e ho scoperto che con float mi da dei valori perfettamente interpretabili:
0.001.000.00 per 1
0.00255.000.00 per 255
0.00255.001.00 per 512
0.00254.00127.00 per 32.766
0.00255.00127.00 per 32.767
quindi è chiarissimo: uno ZERO per la partenza, poi le unita o decine o centinaia fino a un max di 255, poi il moltiplicatore per 256 e due ZERI per il termine.
Ho provato con char, con double ecc... Il miglior risultato è con float e questo mi fa pensare che trasmetta a 32bit (boh!). Però questo non mi interessa: mi interessa leggere e interpretare i dati.
Con NANO come posso ottenere il valore decimale risultante?
Con una stringa? con un array?
Grazie in anticipo.