Coversioni tra binario e decimale frazionario

Buon giorno a tutti.

Da qualche giorno sto tentando di far colloquiare un arduino R3 con uno strumento di misura in modbus.

Da un punto di vista hardware non ho trovato particolari problemi, mentre non si può dire di quello software.

In particolare, a fronte di un valore visualizzato sul display dello strumento di 49,98-50,00 arduino mi ritorna un valore di 16.968, ovviamente con qualche variazione sulle unità.

Analogamente se tento di leggere un altro valore pari a 230,1 arduino mi ritorna 17.256.

Ho tentato di analizzare i valori di ritorno in binario piuttosto che in esadecimale, oppure in BCD, ma senza trovare metodi di conversioni.
Grazie per la collaborazione

posta il codice e i dettagli dello schema/componente

mi sa che llo strumento ti invia delle float e tu le interpreti come int...fai una prova con questo codice e vedrai:

union {
  float f;
  int b[2];
  byte c[4];
} myU;

void setup() {
Serial.begin(9600);
myU.f=49.98;
Serial.println(myU.b[0]);
Serial.println(myU.b[1]);
myU.f=230.1;
Serial.println(myU.b[0]);
Serial.print(myU.b[1]);
}

void loop() {
  // put your main code here, to run repeatedly:

}

Temo di averti fatto perdere tempo ...
Nel frattempo sono riuscito trovare della documentazione ed ho scoperto che i valori seguono lo standar IEEE 754 a 32bit, e pertanto mancava una word.

Ho modificato lo scketch e adesso per un valore visualizzato di 234,2 ho ottenuto due word
dec. 17258 bin 0100001101101010
dec. 39172 bin 1001100100000100

Ho notato che per ripetute letture solo la seconda word subisce modifiche e pertanto deduco che sia la prima a contenere il segno e l'esponente ... forse!
Ad ogni modo vedo se riesco a trovare la soluzione.
Grazie comunque.

Guarda qui , forse ti puo’ essere utile.

Caro Sulimarco ti ringrazio per le dritte che mi hai dato e sono in debito di brioche e cappuccino ...

  1. ho trovato a questo link https://it.wikipedia.org/wiki/IEEE_754 una utile pagina in italiano e armato di gomma e matita ho avuto conferma dei dati ricevuti dal Modbus e mi è anche servito per farmi un'idea sulla formatazione delle float .

  2. Poi ho ricevuto il tuo link che ha confermato il mio lavoro ed ha reso più semplici e rapidi ulteriori test.

  3. Ho ripreso in mano il tuo codice e l'ho modificato al fine di ottenere dalle due word una flot.

union {
  float f;
  word b[2];
  byte c[4];
} myU;

void setup() {
Serial.begin(9600);
myU.f=234.597717285;
Serial.println(myU.f,5);
Serial.println(myU.b[0]);
Serial.println(myU.b[1]);

myU.b[1] = 17258;
myU.b[0] = 39172;
Serial.println(myU.f,5);
}

void loop() {
  // put your main code here, to run repeatedly:

}

Ed ecco il risultato:

234.59771
39172
17258
234.59771

Sorge spontanea un'ultima domanda, data la mia inesperienza su questo tipo di definizioni ("union") sono corrette le mie modifiche al codice?

Grazie dell'aiuto

Sono sicuro che Sulimarco saprà darti tutte le delucidazioni del caso...anche su quel "byte c[4]" che non capisco a cosa possa servire dato che non viene usato... :grin:
ad ogni modo le union sono delle strutture dati particolari dove le varie variabili contenute si riferiscono agli stessi indirizzi di memoria...per esempio...un float occupa 4 byte e parte dall'indirizzo 0...quindi il primo dei suoi byte avrà indirizzo 0, il secondo indirizzo 1, il terzo indirizzo 2 ed il quarto indirizzo 3; se nella stessa union metti anche una arrray di integer a 16 bit (2 byte) del tipo int b[2] avrai che int[0] riporterà gli indirizzi 0 ed 1 mentre int[1] riporterà gli indirizzi 2 e 3 ...e così via per array di byte...la union prende la dimensione della variabile che occupa più spazio.

Per fortuna Sulimarco ha tirato fuori questa definizione, io stavo già pensando di estrarre il valore con qualche AND e SHIFT ...
Nella modalità suggerita il codice è più chiaro e flessibile sopratutto in casi analoghi al mio dove una variabile deve essere scomposta/ricomposta per essere trasferita.

Probabilmente voleva evidenziare la possibilità di accedere a livello di byte

@lelebum ...vai a vedere chi ha scritto il post #3 :wink:

Ops! Errore di sbaglio, a questo punto ti devo 2 brioche e cappuccino.

Ero partito con l'idea di trovare delle difficoltà con la connessione del Modbus ed invece mi sono ritrovato a ripassare logica binaria e conoscere nuove funzione del "C".

Scusandomi per la confusione, ti ringrazio ancora per la collaborazione offerta.

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