Problema CAN-BUS (Char hexadecimal)

Buenas. Ante todo decir que soy nuevo en el foro, y espero no dar muchos problemas con mi proyecto.

En mi proyecto, recibo por CANBUS un cadena de 8 caracteres, por ejemplo:

char Cadena[8]={ 0, 0, 0, C, 1, 2, 6, F};

Al venir por CANBUS, los valores de esa cadena son en hexadecimal. Pues bien, los dos primeros valores no me sirven de mucho, lo que necesito es leer las posiciones 3 y 4 para determinar la cabecera (que me indican si el mensaje contiene velocidad, revoluciones del motor…), y los últimos 4 valores que me indican la magnitud.

Pues bien, por un lado no se bien como podría hacer la comparación de los dos valores de cabecera para saber que estoy leyendo, ni tampoco como convertir la magnitud (126F en el ejemplo) a decimal para sacarlo a través de un display.

¿Podría hacer la comparación de la cabecera con lo siguiente?

if (Cadena[2] == '0x0' && Cadena[3] == '0xC')

Para convertir de hexadecimal a decimal, he usado la siguiente función que vi por internet, y funciona en casi todos los casos, salvo cuando hay un 0 en la magnitud (ejemplo: 2F03 no lo hace bien):

void loop()
{
//Tras leer los datos del CANBUS
hexString[0] = Cadena[4];
hexString[1] = Cadena[5];
hexString[2] = Cadena[6];
hexString[3] = Cadena[7];
Entero = hexToDec();
}

unsigned int hexToDec(String hexString)
{
  int Valor = 0;
  for (int i = 0; i < hexString.length(); i++)
  {
    int nextInt = int(hexString.charAt(i));
    if (nextInt >= 48 && nextInt <= 57) nextInt = map(nextInt, 48, 57, 0, 9);
    if (nextInt >= 65 && nextInt <= 70) nextInt = map(nextInt, 65, 70, 10, 15);
    if (nextInt >= 97 && nextInt <= 102) nextInt = map(nextInt, 97, 102, 10, 15);
    nextInt = constrain(nextInt, 0, 15);

    Valor = (Valor * 16) + nextInt;
  }

  return Valor;
}

Espero que me haya explicado bien.

Saludos :wink:

Podrias probar con la funcion strtol pero tendrias que dividir la cadena en dos arrays de char ,una que contenga los valores 3 y 4 y otra para los otros 4 ,recuerda crear los arrays con una posicion mas de la que necesites para el caracter fin de cadena (por ej. para la de dos valores: char cadena[3]; esa funcion tiene tres parametros ,la propia cadena ,el segundo no se exactamente que es pero en el ejemplo se le pasa NULL y el tercero ,la base en que viene el caracter ,que deberia ser 0x de hexadecimal,por ej:

char cadena[] = "2f";
long resultado = strtol(cadena,NULL,0x);
Serial.println(resultado);

esto no lo he probado,esta sacado de aqui: https://www.thinkage.ca/english/gcos/expl/c/lib/strtol.html

Ya que los tienes separados en un array solo debes convertirlos asi

Entero = Cadena[4]**16^3+Cadena[5]*16^2+Cadena[6]*16^1+Cadena[7]*16^0;

Entero = Cadena[4]**4096+Cadena[5]*256+Cadena[6]*16+Cadena[7];