1

如果我通过 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]

这是如何运作的?

4

2 回答 2

2

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-07T19:34:32.167 回答
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]

这就像我告诉你的那样45 thousands123所以你将你的号码建立为45*1000+123=45123。256 是 2^8,等于一个完整的字节,b'1 0000 0000'。

于 2013-11-08T10:08:55.293 回答