Guardar número HEX como variable [SOLUCIONADO]

Hola a todos, mi problema es que estoy trabajando con infrarrojos y distintas librerías y me he atascado en un asunto que creo que es trivial (simplemente mi fuerte no es C++).
Tengo el código básico para recibir información con la librería IRremote:

#include <IRremote.h>
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn(); // Inicia el receptor
  Serial.println("En marcha:");
}
void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value,HEX);
    irrecv.resume(); // Se prepara para el siguiente valor
  }
  delay(50);
}

Obtengo siempre una salida por pantalla del tipo: 20DF827D donde 20DF será la dirección y 827D el dato que transmito (aumentar en 1 el canal por ejemplo).
Mi duda es ¿cómo hago para guardar como una variable tipo string ese 20DF827D para poder partirlo en 20DF y 827D? Es decir, en la línea:

Serial.println(results.value,HEX);

necesito una función para almacenarlo en lugar de lanzarlo por pantalla, una vez guardado creo que soy capaz de partirlo al gusto.

Un saludo y muchas gracias a todos.

que tipos de datos transmites ,numericos ,texto ,ambos? siempre ocupan lo mismo? es decir los cuatro primeros siempre es direccion y los 4 ultimos el dato? los datos los transmites tu desde otro dispositivo?

Siempre 8 dígitos hexadecimales. Imagino que serán formato char.
Cada vez que pulso un botón de un mando se genera un código decimal (un entero sin signo) que se guarda en results.value. Una vez almacenada puedo sacarla por consola como hexadecimal con:
Serial.println(results.value,HEX);
Pero ese valor sólo puedo verlo, no se almacenarlo como una variable.
¿Alguna idea?
Gracias

te preguntaba si el mensaje lo transmites tu ,porque lo mas facil quizas seria mandar codigo y dato ya separado del emisor al receptor ,asi solo tienes que almacenar directamente el primer mensaje en una variable y el segundo en otra.

Justo he editado conforme escribías.

Cada vez que pulso un botón de un mando se genera un código decimal (un entero sin signo) que se guarda en results.value. Una vez almacenada puedo sacarla por consola como hexadecimal con:
Serial.println(results.value,HEX);
Pero ese valor sólo puedo verlo, no se almacenarlo como una variable.
¿Alguna idea?
Gracias.

supongo que puedes hacer esto:

unsigned long codigo = results.value;

pero lo que no entiendo es lo de partir el codigo que recibes.si usas un mando cada tecla tiene asignado un codigo unico y siempre es el mismo para la misma tecla ,no se como puedes codificar ahi una direccion y un dato.

Si yo hago eso guardaré en la variable "codigo" un número decimal, lo que busco es transformarlo en un número hexadecimal.
Si yo pulso el botón del volumen pongamos que recibo "16". Si yo meto un Serial.print(16,HEX); puedo ver por pantalla "F", sin embargo no tengo manera (no la conozco al menos) de guardar esa F en una variable para poder seguir trabajando con ella más adelante, no sé si ahora me explico.
En cuanto a lo de partir el dato, te comento, cuando yo he pulsado el botón del volumen he obtenido:
20DF40BF, es decir, mi dirección es 20DF y el código "sube el volumen" es 40BF. Por eso necesito guardar el valor.
Muchas gracias.

Supongo que tendras un motivo por el que tiene que ser hexadecimal,pero el valor recibido es el mismo ,sea en hexadecimal,decimal,octal o binario ,lo unico que cambia es la manera de representarlo.en cuanto a lo de los codigos ,no se si estamos hablando de lo mismo o que....tienes un mando ,cuando pulsas un boton
recibes un codigo ,pero en ese codigo no se de donde sacas que tu direccion es 20DF y el codigo 40BF ,es todo un solo numero y lo vas a recibir cada vez que pulses esa tecla,asi como cada tecla tendra su propio codigo diferente ,otra cosa es que tu controles el emisor ,codifiques un codigo y lo envies al receptor,pero si estas usando un mando a distancia esos codigos son siempre los mismos y ya estan predefinidos.Puedes usar la notacion 0x para indicar un hexadecimal ,pero internamente arduino solo entiende binarios y por defecto la funcion Serial.println() representa los valores en decimal:

unsigned long codigo = 0x20DF40BF;
void setup(){
  Serial.begin(9600);
  Serial.println(codigo);
  Serial.println(codigo,HEX);
}
void loop(){
  
}

Solucionado, puedo almacenarlo en una variable con un String Constructor.

String DatosHEX=String(Results.value,HEX);

jose:
Supongo que tendras un motivo por el que tiene que ser hexadecimal,pero el valor recibido es el mismo ,sea en hexadecimal,decimal,octal o binario ,lo unico que cambia es la manera de representarlo.en cuanto a lo de los codigos ,no se si estamos hablando de lo mismo o que....tienes un mando ,cuando pulsas un boton
recibes un codigo ,pero en ese codigo no se de donde sacas que tu direccion es 20DF y el codigo 40BF ,es todo un solo numero y lo vas a recibir cada vez que pulses esa tecla,asi como cada tecla tendra su propio codigo diferente ,otra cosa es que tu controles el emisor ,codifiques un codigo y lo envies al receptor,pero si estas usando un mando a distancia esos codigos son siempre los mismos y ya estan predefinidos.Puedes usar la notacion 0x para indicar un hexadecimal ,pero internamente arduino solo entiende binarios y por defecto la funcion Serial.println() representa los valores en decimal:

unsigned long codigo = 0x20DF40BF;

void setup(){
  Serial.begin(9600);
  Serial.println(codigo);
  Serial.println(codigo,HEX);
}
void loop(){
 
}

A ver, te repito, yo toco ahora 3 botones aleatorios del mando, y lo dejo en decimal, obtengo:
551534655
551502015
551518335
Lo cual es en primer lugar "pesado" de separar y en segundo, según el mando, lioso (¿cuántos dígitos son la dirección? ¿cómo parto un decimal?).
Si yo trabajo en hexadecimal obtengo:
20dfc03f
20df40bf
20df807f
Esto me agiliza la vida bastante, en primer lugar hay chorrocientos comandos para partir strings sin pensar demasiado, en segundo lugar no hay lío posible, los 4 primeros dígitos van a ser siempre la dirección y los siguientes 4 la instrucción.

Espero haber sido suficientemente claro en el porque, en cualquier caso muchas gracias por la ayuda.
Doy esto por solucionado.

1 Like

si tu lo ves claro,pues perfecto ,porque yo cada vez lo entiendo menos.

Resumiéndolo al máximo:
Me es más fácil partir en dos cachos para mis malvados fines un string de 8 letras (que por convenio siempre va a tener 8 letras) que un decimal que ni siquiera sé que va a ocupar o que incluso sabiendo que va a ocupar no sé desde donde a donde lo voy a querer romper.
Por eso necesito transformar lo que recibo (un número llámalo x, 1000000 o 543588934) a HEX, donde ya me muevo con más agilidad (FFFFFFFF, 2FD5427D, 11111111... siempre 8 dígitos, 4 de dirección, 4 de instrucciones) .
No es más que eso, al principio podía ver el número hexadecimal, pero yo no quería verlo, quería cogerlo, añadirle, quitarle... lo quería en una variable.
Con ese comando ya está guardado. Muchas gracias por todo, y si después sigues sin entender y quieres más detalles avisa.
Gracias por el interés.