Сохранение сообщения rs232 в переменную

Если я получаю сообщение через 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]

Как это работает?

1

Решение

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));
2

Другие решения

Процедура декодирования:

//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 ‘.

0

По вопросам рекламы [email protected]