Как я могу конвертировать unsigned int в unsigned char - PullRequest
0 голосов
/ 25 июня 2018

Я пытаюсь подключить модуль цифрового датчика к чипу Arm Cortex M4F.

Полученные данные составляют 3 байта от модуля.Однако единственная функция, которую я имею в своем MCU - это функция чтения uint32_t.Я не знаю, почему нет функции uint8_t, но, возможно, это просто вопрос сдвига битов?Я изучаю c ++, как я иду сюда.

Итак, я читаю значение как:

uint32_t value = mcu_read(pin);

value теперь содержит uint32_t, 4 байта.Мне нужны первые три.Можно ли как-то сдвинуть его, чтобы «извлечь» их?Имеет ли это смысл?Showtopper - это функция mcu_read, которая читает минимум 4 байта.Если бы там была функция чтения uint8_t, я мог бы просто вызвать ее три раза, чтобы получить нужные мне данные.

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Вы можете извлечь байты с сдвигом битов и логическим и :

uint32_t value = mcu_read(pin);
uint8_t byte_0 = (value >> 24) & 0xFF;
uint8_t byte_1 = (value >> 16) & 0xFF;
uint8_t byte_2 = (value >> 8) & 0xFF;
uint8_t byte_3 = (value) & 0xFF;
0 голосов
/ 25 июня 2018
#include <stdio.h>
#include <stdint.h>

int main()
{
    uint32_t value = 0xAABBCCDD;
    //-------------------------------
    //byte3 | byte2 | byte1 | byte0 | 
    //-------------------------------
    uint8_t byte_0 = (uint8_t)value; //truncation according to casting rules
    printf("first byte: %x\n",byte_0);
    value>>=8; //right shift will result in the following bytes:
    //-------------------------------
    // garbage | byte3 | byte2 | byte1 | 
    //-------------------------------
    uint8_t byte_1 = (uint8_t)value;
    printf("second byte: %x\n ",byte_1);
    value>>=8;
    //etc...
}

выход:

first byte: dd
second byte: cc
0 голосов
/ 25 июня 2018

Как-то так?

uint32_t value = mcu_read(pin);
uint8_t* bytes = (uint8_t*)(&value);
uint8_t byte_0 = bytes[0];
uint8_t byte_1 = bytes[1];
uint8_t byte_2 = bytes[2];
uint8_t byte_3 = bytes[3];

Будьте осторожны с порядком байтов

...