Сохранение сообщения rs232 переменной

58
8

Если я получаю сообщение через RS232, состоящее из 2 байтов, например 0000 0001 0001 1100 (то есть 100011100, lsb справа), я хочу сохранить его в переменной, называемой значением.

Я "декодирую" поток байтов с помощью этого шага:

rxByte = Serial1.read()

messageContent[0] = rxByte

messageContent[1] = rxByte

с первым rxByte, имеющим значение 0000 0001 и вторым 0001 1100. Или это те значения, которые уже были преобразованы внутри на HEX или DEC?

Теперь я видел код, который сохраняет его таким образом:

uint32_t value = messageContent[0] *256 + messageContent[0]

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

спросил(а) 2013-11-07T22:17:00+04:00 6 лет, 10 месяцев назад
1
Решение
70

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

ответил(а) 2013-11-07T22:34:00+04:00 6 лет, 10 месяцев назад
41

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

//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 value = messageContent [0] * 256 + messageContent [0]

Это, как я расскажу вам, 45 thousands и 123, поэтому вы строите свой номер как 45*1000+123=45123. 256 - 2 ^ 8, равный полному байту, b'1 0000 0000 '.

ответил(а) 2013-11-08T13:08:00+04:00 6 лет, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема