Перейти к содержанию
    

Как разделит uint32 на четыре uint8

Здрасвуйте, у меня есть данные которые я получаю от датчика температуры.
В efr32 нет возможности послат 32bit сразу
Я хочу послать по 8 бит кусками через UART.

Допустем мой uint32 Он:
uint8_t Tx_PP[4] = {0x02,0xF0,0x03,0xE7}; 
Как я делю uint32 на 4 uint8?
Thanks.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, sergei94 said:

Как я делю uint32 на 4 uint8?

Ножом по четвертинкам.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 hours ago, sergei94 said:

Как я делю uint32 на 4 uint8?

Можете так

union My32bit {
  uint32_t figure32;
  uint8_t figure8[sizeof(figure32)];
};

My32bit a.figure32 = 0xaabbccdd;

spi_send(a.figure8, sizeof(figure8)); // где a.figure8 массив 8-би битных числе, он же указатель на этот массив

Или так

uint32_t figure32 = 0xaabbccdd;

const uint8_t * p8 = static_cast<uint8_t *>(&figure32);
for(int counter = 0; counter < sizeof(figure32); counter++) {
  spi_send_byte(*p8++);
}

Синтаксис не проверял. Могу по мелочам ошибиться. Но общий принцип я написал вам верно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я попробовал  следущий метод показанный снизу но неуверен в & * адресации?
did i split the uint32_t correctly?
Thanks.

uint8_t arr[4];
uint32_t Tx_PP= {0x02F003E7}; 
arr[0]=*Tx_PP
arr[1]=*(Tx_PP+8)
arr[2]=*(Tx_PP+16)
arr[3]=*(Tx_PP+24)
SPI_tranfer(USART1,arr[0]);

Изменено пользователем sergei94

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а почему не простое

a [0] = val >> 0;
a [1] = val >> 8;
a [2] = val >> 16;
a [3] = val >> 24;


Зачем изобретать когда есть просто способы попроще?
Как определять будете что не с середины принимаете?
Про байтстаффинг прочтите.
Или в тестовом виде гоните


 

Изменено пользователем GenaSPB

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, sergei94 said:

Я попробовал  следущий метод показанный снизу но неуверен в & * адресации?
did i split the uint32_t correctly?
Thanks.

uint8_t arr[4];
uint32_t Tx_PP= {0x02F003E7}; 
arr[0]=*Tx_PP
arr[1]=*(Tx_PP+8)
arr[2]=*(Tx_PP+16)
arr[3]=*(Tx_PP+24)
SPI_tranfer(USART1,arr[0]);

арифметика указателей не в битах идёт, а в размерах того на что указывается, для "байтовой" арифметики надо тип указателя привести к указателю на uint8_t.

то есть (&Tx_PP + 8) укажет на 8е слово, т.е. 32й байт относительно Tx_PP.

и uint32_t Tx_PP= {0x02F003E7}; это инициализация массива, а не uint32_t - фигурные скобки не нужны.

и оператор * - разименовывание указателя, а & - указатель на.

почитайте букварь по С какой-нибудь.

 

arr[0]= ((uint8_t*) &Tx_PP) [0];

arr[1]= ((uint8_t*) &Tx_PP) [1];

...

либо

memcpy(arr, &Tx_PP, 4);

хотя зачем лишний раз копировать если сразу можно нужный байт достать

SPI_Transfer(USART1, ((uint8_t*) &Tx_PP)[0]);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ТС надо книжку по С почитать на ночь. Даже базовых знаний нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, sergei94 said:

Я попробовал  следущий метод

Чем мои примеры не устроили? Зачем задаёте вопросы, если всё-равно делаете по-своему?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вероятно проще всего объявить struct/union и не париться со сдвигами и странными расчетами адресов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, haker_fox said:

Чем мои примеры не устроили? Зачем задаёте вопросы, если всё-равно делаете по-своему?

No offense,Thanks for the help.i will try these variation and hopefully get the result.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...