Oi Pessoal, boa noite.

Vi um amigo no chat pedindo ajuda pra trans formar uma leitura de uma TAG RFID
em um valor decimal.

Aí fui procurar na net, e não encontrei nada pronto, e muita informação confusa.

Não sei se tem algo pronto, mas resolvi escrever uma função pra fazer isto.

Ele converte um numero de até 8 dígitos (4 bytes) recebidos em formato string, em valor
hexadecimal ( e claro decimal).


Ex: String "F47BC7A4" em 0xF47BC7A4 -- -- > > 4101752740.

Rui

Exibições: 474

Anexos

Responder esta

Respostas a este tópico

Excelente função que ajudará muitas pessoas, obrigado Rui!

Grande Rui, bom dia!

Existem alguns métodos na classe String que convertem para int e float.

Existe um construtor também que pode ser usado para converter um número para as bases binária e decimal.

No entanto a conversão para hexadecimal retorna outra String, diferente da sua sua função. Então não sei se atende o que você quer


Veja um exemplo:

String MinhaStr = "547543B2";
int ConvertidoInt = MinhaStr.toInt(); // Converte para int
float ConvertidoFloat = MinhaStr.toFloat(); // Converte para float
String ConvertidoHex = String(ConvertidoInt, HEX); // Converte para HEX
String ConvertidoBin = String(ConvertidoInt, BIN); // Converte para Binario

Desculpe postar o código aqui, mas é tão pequeno que achei que não ia atrapalhar


Abraço.

Oi JAC, boa tarde.
obrigado pelo seu comentário.
Ele abre uma boa oportunidade de discussão sobre um área um pouco confusa dentro do manuseio de dados.

É bem interessante o uso destes método que você citou, mas dependendo do dado que manuseamos, eles não atendem nossa necessidade, e por isto resolvi escrever aquela função.


Não sei se existem métodos que fazem o que fiz na função.


Para exemplificar melhor, escrevi um code que imprime a conversão de duas strings com valores hexadecimais,  547543B2 e ABCDEF32.


Usei vários métodos para conversão e depois usei a função que escrevi.
Anexo listagem com resultado obtido com cada método:

Como a string tem letras (Valores Hexadecimais) na sua composição, o usar os métodos
estes valores são desprezados, e o resultado final é completamente errado.

Mesmo usando a função que escrevi, temos que levar em conta o tamanho da variável, pois ao tentar converte um valor long (4 bytes) em int (assinalado), teremos erro de valores.

Veja as flechas vermelhas em "inteiro".
Ao converter um long pra float, perde em precisão, já que float tem uma aproximação de valores.

Outra observação que faço, é que vejo diversos amigos tentando fazer conversão de valores
que são perfeitamente dispensáveis.


Exemplificando:


Se eu tenho um valor de uma variável int x = 500.


O valor na realidade é armazenado com 0x50 0x00, pois todo valor processado é um hexadecimal.

Quando temos uma string "ABCD1", na realidade temos 0x42 0x43 0x44 0x45 e 0x31, e temos

que converter para 0x0A 0x0B 0x0C e 0x01, aí sim entra a função que escrevi.


Se quiser imprimi-lo em hexadecimal, basta escrever Serial.print(x,HEX);
Se quiser imprimi-lo em decimal, Serial.print(x,DEC);
Se quiser imprimi-lo em binário, Serial.print(x,BIN);

mas se quiser imprimir o valor float, deve converte-lo assim  Serial.print(float(x));

Um abraço.

Rui


Anexo listagem com resultados e code utilizado para obtê-los.

Anexos

Rui, realmente.

O método que sugeri só transforma valores decimais em numéricos (hexa e binário)

Valores em outras bases, ele não vai funcionar.

Não havia atentado para a origem dos dados ser hexadecimal.

Estou ficando velho e os neurônios não funcionam mais como antes. Kkkk!

Mas fica aí as dicas para os amigos garagistas usarem em seus programas, de acordo com a necessidade.

Abraço

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço