如果我通过RS232收到一条由2字节长度组成的消息,例如0000 0001 0001 1100(即100011100,右侧的lsb),我想将其保存到一个名为value的变量中。
我正在通过此步骤"解码"字节流:
rxByte = Serial1.read()
messageContent[0] = rxByte
messageContent[1] = rxByte
第二个 0001 1100。或者这些值是否已经在内部转换为十六进制或 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();
或者这些值是否已经在内部转换为十六进制或 DEC?
数据始终是二进制的。十六进制或十进制只是它的表示。你说"变量 x 作为 123 的值"——这是人类的解释,实际上变量 x 是一个内存块,由一些字节组成,这些字节本身就是 8 位组。
现在我已经看到了以这种方式将其保存为值的代码:
uint32_t值 = 消息内容[0]*256 + 消息内容[0]
这就像我告诉你45
thousands
和123
,所以你把你的数字建立为45*1000+123=45123
。 256 是 2^8,等于一个完整的字节,b'1 0000 0000'。