Если я получаю сообщение через RS232 длиной 2 байта, например, 0000 0001 0001 1100 (то есть 100011100, lsb справа), я хочу сохранить его в переменной с именем value.
Я «расшифровываю» поток байтов с помощью этого шага:
rxByte = Serial1.read ()
messageContent[0] = rxByte
messageContent[1] = rxByte
первый rxByte имеет значение 0000 0001, а второй 0001 1100.
Или эти значения уже преобразованы внутренне в HEX или DEC?
Теперь я видел код, который сохраняет его таким образом, чтобы оценить:
uint32_t value = messageContent[0] *256 + messageContent[0]
Как это работает?
messageContent[0] *256
по сути битовый сдвиг: код эквивалентен (и более читабелен как)
uint32_t value = (messageContext[0]) << 8 + messageContent[1];
Так что если `messageContent [0] = 0x01 ‘и messageContext [2] = 0x1C
value = (0x01 << 8)+0x1C
value = (0x0100)+0x1C
value = 0x011C
Работает найти, но в зависимости от порядкового номера вашей машины, это эквивалентно:
uint32_t value = *((uint16_t*)(messageContext));
Процедура декодирования:
//char messageContent[2]; //Always keep in mind datatypes in use!!!
messageContent[0] = Serial1.read()
messageContent[1] = Serial1.read()
То, что вы делали, устанавливало одинаковое значение в обеих позициях
Если вы хотите прочитать оба байта в 16-битное или большее целое число:
short int messageContent = Serial1.read()<<8+Serial.read();
Или эти значения уже преобразованы внутренне в HEX или DEC?
Данные всегда двоичные. Hex или Dec — это просто его представление. Вы говорите «переменная x как значение 123» — это человеческая интерпретация, на самом деле переменная x является блоком памяти, состоящим из нескольких байтов, которые сами по себе являются группами из 8 битов.
Теперь я видел код, который сохраняет его таким образом, чтобы оценить:
Значение uint32_t = messageContent [0] * 256 + messageContent [0]
Это как я тебе говорю 45
thousands
а также 123
, так что вы строите свой номер как 45*1000+123=45123
, 256 равно 2 ^ 8, что соответствует полному байту, b’1 0000 0000 ‘.