Ir ao conteúdo

Posts recomendados

Postado

Olá, estou lendo alguns registradores de holding (16bits cada) de sensores porém os dados são floats trocados de 4 bytes, ou seja, cada dois registros recebidos devem ser trocados, convertidos em hexa, concatenados e então convertidos para float. Por exemplo: o valor de temperatura é dados por 0 16991, invertendo a ordem  (16991 0) e convertendo para hexa 0x410f0000 que em float : 35,75. Eu consegui juntar os valor todo em hexa em uma string e estava tentando utilizar a função strtoul para converter para float mas sem sucesso, aparece mensagem de erro porque o valor está em uma strign...Enfim, se alguém puder dar uma dica de como realizar essa conversão, agradeço muito.

 

Obs: os dados recebidos são do tipo uint16_t.

  • Obrigado 1
Postado

0x410f0000 que em float da  8.9375

0x420f0000 é que dá 35.75

https://www.h-schmidt.net/FloatConverter/IEEE754.html

De todo modo, seria algo assim o que procura?

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    char hex[11] = "0x420F0000";
    
    unsigned long l = strtoul(hex, NULL, 16);
    float f = *((float*)&l);
    printf("%f", f);
    return 0;
}

 

  • Curtir 2
Postado

@Flávio Pedroza  obrigada por responder! Então, eu estava usando esse processo..porém os valores que recebo estão em decimal, eu teria que convertê-los para hexa e em seguida para char. Para transformar em hexa estou usado:

 

<

uint16_t data[2]; // vetor com  os dois registros que compõem a variável, no caso:
//data[0] = 0;
//data[1] = 16911;


String varHex1[1] =  String(data[1], HEX);   
String varHex2[1] =  String(data[0], HEX);
String vetorhex[1] =  varHex1[0] + varHex2[0]; //retorna o valor em hexa mas na ordem correta e tudo junto: 420f0

>

 

Não achei outra forma de converter para hexa, o problema é que não sei como "extrair" o valor em hexa da string e convertê-lo em char para então usar a solução que você propôs. E ainda tem o problema que 420f0 é diferente de 410f0000...Se puder me ajudar com outra dica, agradeço muito.

adicionado 48 minutos depois

@Matheus0019 obrigada pela resposta ! O problema é que o hexa que consigo não está no formato "0x420f0000", como char...mas apenas uma posição de uma string de um valor que está em hexa. Não achei outra forma de passar de dec para hex sem ter que colocar numa string..

Postado

Exclamacao.png.78aa600c6b3a434a3882f612e8d0d279.pngBom Dia @Wyara Souza , tudo bem. Então eu não sou especialista em programação e não tenho experiência em análise de algoritmos complexos.

 

Mesmo assim, acredito que @Flávio Pedroza e tu chegaram a solução do problema, e sem a necessidade de tantas conversões. Estou vendo, daqui, que atribui ao vetor data, mesmo que em comentário, os valores corretamente em ordem significativa.

"

 

Eu enxergo bem isso na programação

uint16_t data[2]; // vetor com  os dois registros que compõem a variável, no caso:
		data[0] = 0;
		data[1] = 16911;

 

Note agora que se aplicar a transformação (casting) de ponteiros no identificador, conforme exemplificado e atribuir a variável float  sua tradução de bits estará completa.

 

Exemplo

float f = *((float *) data);

 

Pronto! Aqui funcionou e o resultado é 35,75

Desculpa se estou errado, e pela intromissão.

"

  • Curtir 1
  • Amei 1
Postado

você está programando no arduino? Vi que essa classe String tem um metódo "c_str()".

https://www.arduino.cc/reference/pt/language/variables/data-types/string/functions/c_str/

Basta chamar esse método:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
  	uint_16 data[2];
	String varHex1 =  String(data[1], HEX);   
	String varHex2 =  String(data[0], HEX);
	String vetorhex =  varHex1 + varHex2;
	
    
    unsigned long l = strtoul(vetorhex.c_str(), NULL, 16);
    float f = *((float*)&l);
    printf("%f", f);
    return 0;
}

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...