concatenar y convertir

Hola,

Tengo un array de bytes VAL5 = {0,0,1,7C};

y debo conseguir una concatenación a 0x17C

ya que el valor que debo printar por el Serial1.print es 380

he probado de usar sprintf pero no me acaba de funcionar

gracias de antemano

Cinco bytes solo caben en un uint64_t (a menos que estés utilizando una arquitectura ARM), y desafortunadamente no hay implementación para imprimir en ese tipo de dato.

Sin embargo, es posible imprimir el valor hexadecimal de un conjunto de n (cualquier número de) bytes. Prueba esta función (patox) y luego me cuentas:

unsigned int patox(Print* output, byte* a, int len, bool header, bool zeroLead, bool bigEndian) {
  if (len < 1) return 0;
  unsigned int count = header ? output->print(F("0x")) : 0;
  int i;
  bool stillLeading = true;
  --len;
  if (bigEndian) {
    for (i = len; i > 0; i--) {
      if (stillLeading) {
        byte b = a[i];
        if (b) {
          count += printHex(output, b, zeroLead);
          stillLeading = false;
        } else if (zeroLead) count += output->print(F("00"));
      } else count += printHex(output, a[i], true);
    }
  } else {
    for (i = 0; i < len; i++) {
      if (stillLeading) {
        byte b = a[i];
        if (b) {
          count += printHex(output, b, zeroLead);
          stillLeading = false;
        } else if (zeroLead) count += output->print(F("00"));
      } else count += printHex(output, a[i], true);
    }
  }
  return count + printHex(output, a[i], !stillLeading || zeroLead);
}

byte printHex(Print* output, byte b, bool zeroLead) { // Se puede usar, aunque primordialmente es de soporte para la función principal
  byte count = 0;
  if (b > 15) count += output->print(b, HEX);
  else {
    if (zeroLead) count += output->write('0');
    count += output->print(b, HEX);
  }
  return count;
}

Parámetros de la función:

output: un puntero hacia un objeto que herede de Print (ej.: Serial, File, Wire, etc.). Se coloca un & antes del nombre.
a: un puntero de byte (o el nombre de un vector de dicho tipo).
len: longitud del vector ingresado, en bytes. Usualmente se saca con sizeof.
header: booleano utilizado para indicar si se quiere o no incluir la cabecera “0x” típica de toda representación hexadecimal.
zeroLead: booleano utilizado para indicar si se quiere o no que hayan ceros a la izquierda (de la primera cifra diferente de cero).
bigEndian: el orden de los bytes se asumirá “big-endian” (MSB primero) si se introduce true o sus equivalentes.

El retorno es la cantidad de caracteres que en realidad se escribieron al flujo de salida (especificado en output).

Para tu caso, se aplicaría así:

patox(&Serial, VAL5, sizeof(VAL5), true, false, true);
// Imprimir al puerto serial, VAL5 como origen, tiene sizeof(VAL5) bytes, con "0x", sin ceros a la izquierda y MSB primero