2013-11-07 3 views
1

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

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

rxByte = Serial1.read()

messageContent[0] = rxByte

messageContent[1] = rxByte

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

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

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

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

ответ

2

messageContent[0] *256 по существу Bitshift: код equivelent (и более читаемым, как)

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

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

//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]

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

+0

«Вы строите свой номер как 45 * 1000 + 123 = 45123« Я понял, почему, но не так ... Итак, компьютер всегда знает, что «* 256» является десятичным?он также может быть шестнадцатеричным, а затем битдвиг не будет работать. К вашему первому пункту: конечно, rxbyte = Serial1.read() выполняется на каждой итерации, это просто для того, чтобы показать, как я это делаю. – user2366975

+0

Правила компилятора C определяют, что написано (в вашем исходном коде C) как десятичное (255), hex (0xff) или восьмеричное (0377). –

Смежные вопросы