Autor Tema: Print float como hex  (Leído 1186 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado cvargcal

  • PIC16
  • ***
  • Mensajes: 166
Print float como hex
« en: 24 de Marzo de 2019, 11:46:30 »
Saludos,Quiero hacer esto, pero no se como enviar el negativo.

Código: C
  1. #include <stdio.h>
  2. #include <stdint.h>
  3.  
  4. void main(){
  5.  
  6.                         int port=4;
  7.                         int32_t lat_x=(6.3456*1000000);
  8.                         int32_t  logx=(-75.5666*1000000);
  9.                         int id=1;
  10.                        
  11.                         printf("mac tx cnf %u %x%lx%lx%\r\n",port,id,lat_x,logx);    
  12.                         printf("\r\nID = %xr\n",id);
  13.                         printf("Lat= %lx\r\n",lat_x);
  14.                         printf("Log= %lx\r\n",logx);
  15. }

Necesito enviar coordenadas gps por el protocolo lora, solo puede ser en HEX.


Creo que es sobre CONVERT Microchip to IEEE-754.
Pero no tengo ni idea como se hace


Ya tengo la respuesta
Funciones

Código: C
  1. int32 f_PICtoIEEE(float f)    
  2. {    
  3.    int16 c[2];    
  4.      
  5.    memcpy((int8*)c  , ((int8*)&f)+3, 1);    
  6.    memcpy((int8*)c+1, ((int8*)&f)+2, 1);    
  7.    memcpy((int8*)c+2, ((int8*)&f)+1, 1);    
  8.    memcpy((int8*)c+3, ((int8*)&f)  , 1);    
  9.    c[1] = ((c[1] >> 1) & 0x7F80) + (c[1] & 0x7F) + ((c[1] & 0x80) << 8);    
  10.    return ((int32)c[1] << 16) | c[0];    
  11. }    
  12.    
  13.    
  14. float f_IEEEtoPIC(int32 f)    
  15. {    
  16.    float ret;    
  17.    int16 temp;    
  18.      
  19.    memcpy(&temp, ((int8*)&f)+2, 2);    
  20.    temp = ((temp << 1) & 0xFF00) + (temp & 0xFF);    
  21.      
  22.    if(bit_test(f, 31))      // Test the sign bit    
  23.       temp |= 0x0080;    
  24.    else    
  25.       temp &= 0xFF7F;    
  26.      
  27.    memcpy(((int8*)&ret)+3, ((int8*)&f)     , 1);    
  28.    memcpy(((int8*)&ret)+2, ((int8*)&f)+1   , 1);    
  29.    memcpy(((int8*)&ret)+1, ((int8*)&temp)  , 1);    
  30.    memcpy(((int8*)&ret)  , ((int8*)&temp)+1, 1);    
  31.      
  32.    return ret;    
  33. }


Código: C
  1. void main() {
  2.    while(1)    {
  3.  
  4.    fprintf( lora, "Example test..\n\r" );
  5.  
  6.    float32 f=0.1234;
  7.    int32 ieeeValue;
  8.    float32 myFloat;
  9.    ieeeValue = f_PICtoIEEE(f);
  10.    myFloat   = f_IEEEtoPIC(ieeeValue);
  11.    fprintf( lora, "Float:    %0.4f\n\r", myFloat );
  12.    fprintf( lora, "HEX IEEE: %LX\n\r", ieeeValue );
  13.    
  14.    
  15.    fprintf( lora, "\n\r\n\r GPS..\n\r\n\r" );
  16.    float32 lat=6.3456;
  17.    float32 log=-75.5666;
  18.    int32 lat_ieee;    
  19.    int32 log_ieee;    
  20.  
  21.     // Values IEEE
  22.    lat_ieee = f_PICtoIEEE( lat);
  23.    log_ieee = f_PICtoIEEE( log);
  24.    fprintf( lora, "HEX IEEE: %LX\n\r", lat_ieee );   // 40CB0F28
  25.    fprintf( lora, "HEX IEEE: %LX\n\r", log_ieee );   // C2972219
  26.    
  27.    break;     //
  28.  
  29.    }
  30. }

Aquí se puede validar
https://babbage.cs.qc.cuny.edu/ieee-754.old/32bit.html
https://www.h-schmidt.net/FloatConverter/IEEE754.html
http://www.ignogantes.net/envio-de-datos-en-punto-flotante-desde-el-pic-al-computador-y-viceversa/
« Última modificación: 24 de Marzo de 2019, 15:16:04 por cvargcal »