es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Copia la variable de tamaño más grande “unit16” a un tamaño de arreglo más pequeño “uint8” equivalente mediante un casting en C.

Tengo la variable uint16_t value y quiero copiarla en uint8_t buffer[3]. ¿Es posible hacerlo (Little endian)?:

*buffer = *(uint8_t *)&value;

En lugar de:

buffer[0] = highByte(value);
buffer[1] = lowByte(value);

Ya que esta sustitución hace que el I2C del stm32f7 no funcione correctamente. ¿Existe alguna conversión correcta?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    No, el código de reemplazo *buffer = *(uint8_t *)&value no es correcto y puede potencialmente causar problemas con la comunicación I2C en stm32f7. Esto se debe a que asume una arquitectura little endian, donde el byte menos significativo se almacena primero en la memoria. Sin embargo, si la arquitectura es big endian, este código resultaría en la transmisión incorrecta de datos a través de la I2C.

    Una forma correcta de copiar el valor uint16_t en uint8_t buffer[3] sería:

    buffer[0] = (uint8_t)(value >> 8); // byte alto
    buffer[1] = (uint8_t)(value);      // byte bajo
    buffer[2] = 0;                     // byte de relleno opcional
    

    Este código extrae explícitamente el byte alto y el byte bajo del valor uint16_t y los almacena en el buffer en el orden correcto, independientemente de la endianidad del sistema.

Comments are closed.