xztau
@xztau
Я

Как можно интерпретировать uint32_t в регистры uint8_t?

Приветствую!
Программа для STM32.
В памяти есть переменные uint32_t, нужно переменные переслать по UART регистр которого uint8_t.
Есть пара вариантов:
1) Через объединение
uint8_t transmitBuffer[32];
union {
	uint32_t var;
	uint8_t a_var[4];
} interprVar;

uint32_t temp = 0xFFFF;

interpVar.var = temp;

for (unsigned char i = 0; i < 4; i++)  {
    transmitBuffer[i] = interprVar.a_var[i];
}

2) Или же через сдвиги:
transmitBuffer[0] = 0x000000FF & (temp >> 24);
transmitBuffer[1] = 0x000000FF & (temp >> 16);
transmitBuffer[2] = 0x000000FF & (temp >> 8);
transmitBuffer[3] = 0x000000FF & (temp);  
  
HAL_UART_Transmit_IT(&huart1, transmitBuffer, 4);

Через указатель боюсь.
Какие косяки меня могут поджидать?
Есть способ лучше?
  • Вопрос задан
  • 564 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Какие косяки меня могут поджидать?

Разный порядок передачи байтов (big/little endian), в двух ваших примерах он уже разный (учитывая, что STM32 -- little endian по умолчанию).

Есть способ лучше?

С точки зрения сгенерированного кода оба предложенных варианта одинаковы.
С точки зрения читабельности (и при отсутствии требований к порядку байтов) я бы предложил следующее:
void send_uint32(uint32_t v)
{
    uint8_t transmitBuffer[4];
    memcpy(transmitBuffer, &v, sizeof(v));
    HAL_UART_Transmit_IT(&huart1, transmitBuffer, sizeof(v));
}


При наличии требований к порядку байтов я бы выбрал сдвиги.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы