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»
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
Enllaç a un codificador / descodificador de nombres reals IEEE-754 (Codi a GitHub d'en Ray Toal)
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
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
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}];