Diferència entre revisions de la pàgina «Transmissió d'un número real de tipus IEEE-754 (4 bytes) i llur recuperació a NodeRED»

De binefa.com
Salta a la navegació Salta a la cerca
Línia 42: Línia 42:
  
 
El flux de NodeRED superior el podeu descarregar aquí: [https://www.binefa.cat/training/codes/nodered/exempleDescodificantIEEE754.json Arxiu ''exempleDescodificantIEEE754.json'' amb un flux importable a NodeRED com a exemple de descodificació IEEE-754]
 
El flux de NodeRED superior el podeu descarregar aquí: [https://www.binefa.cat/training/codes/nodered/exempleDescodificantIEEE754.json Arxiu ''exempleDescodificantIEEE754.json'' amb un flux importable a NodeRED com a exemple de descodificació IEEE-754]
 +
 +
=== Node d'injecció ''-12.3 en cadena de 32 zeros i uns'' ===
 +
[[Image:Ieee754NodeRedInjeccio.png|center|Flux descodificant IEEE-754]]
 +
 +
=== Funció ''n -> 2 decimals'' ===
 +
msg.payload = parseFloat(parseInt(msg.payload * 100))/100;
 +
return msg;
 +
 +
=== Funció ''Injecció de -12.35 --> [193,69,153,154]'' ===
 +
msg.payload = [193,69,153,154];
 +
return msg;
 +
 +
=== Funció ''Vector 4 números -> Cad 0 i 1'' ===
 +
var vector = msg.payload;
 +
var zerosUns = "";
 +
var currentBits = "";
 +
for(var i = 0; i < 4; i++){
 +
    currentBits = vector[i].toString(2);
 +
    while(currentBits.length < 8)
 +
        currentBits = "0" + currentBits;
 +
    zerosUns += currentBits;
 +
}
 +
return [msg,{"payload":zerosUns}];

Revisió del 18:18, 6 feb 2022

Transmissió d'un nombre real IEEE-754

Representació d'un nombre real (tipus float en C de 4 bytes) en format IEEE-754

IEEE Standard 754 Floating Point Numbers

How to convert decimal numbers from base ten to 32 bit single precision IEEE 754 binary floating point standard

Enllaç a un codificador / descodificador de nombres reals IEEE-754 (Codi a GitHub d'en Ray Toal)

Exemple de codificació / descodificació IEEE-754

Exemple de conversió d'un nombre real a 4 bytes

Codi en C de l'IDE d'Arduino:

#define N_DATA_BYTES 4

union uFloat{
 float f;
 unsigned char uc[4];
};

static uint8_t mydata[N_DATA_BYTES];

void vVisualitzacioFloatEnBytes(float fNum){
  union uFloat ufA;
  int i,k;

  ufA.f = fNum;
  Serial.print("Vector de bytes: ");
  for(i = N_DATA_BYTES - 1 , k = 0 ; i >= 0 ; i-- , k++ ){
    mydata[k] = ufA.uc[i];
    Serial.print(mydata[k],DEC);Serial.print(" ");
  }
  Serial.println();
}

Per si us cal repassar la diferència entre una unió i una estructura en C (Cerqueu la imatge que clarifica la diferència)

Recuperació d'un nombre real a NodeRED

Instal·lació del node node-red-contrib-float

Node node-red-contrib-float de NodeRED per a convertir números reals en format IEEE-754 apartir d'una cadena de zeros i uns. Instal·leu-ho anant a Menú / Settings / Palette / Install cercant IEEE-754.

Exemple d'ús al NodeRED emprant el node node-red-contrib-float

Flux descodificant IEEE-754

El flux de NodeRED superior el podeu descarregar aquí: Arxiu exempleDescodificantIEEE754.json amb un flux importable a NodeRED com a exemple de descodificació IEEE-754

Node d'injecció -12.3 en cadena de 32 zeros i uns

Flux descodificant IEEE-754

Funció n -> 2 decimals

msg.payload = parseFloat(parseInt(msg.payload * 100))/100;
return msg;

Funció Injecció de -12.35 --> [193,69,153,154]

msg.payload = [193,69,153,154];
return msg;

Funció Vector 4 números -> Cad 0 i 1

var vector = msg.payload;
var zerosUns = "";
var currentBits = "";
for(var i = 0; i < 4; i++){
   currentBits = vector[i].toString(2);
   while(currentBits.length < 8)
       currentBits = "0" + currentBits;
   zerosUns += currentBits;
}
return [msg,{"payload":zerosUns}];