如果我通过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]
这是如何运作的?
答案 0 :(得分:2)
messageContent[0] *256
本质上是一个bithift:代码是等同于(并且更具可读性)
uint32_t value = (messageContext[0]) << 8 + messageContent[1];
所以如果`messageContent [0] = 0x01'和messageContext [2] = 0x1C
value = (0x01 << 8)+0x1C
value = (0x0100)+0x1C
value = 0x011C
Works find,但取决于您的机器的endianess,它相当于:
uint32_t value = *((uint16_t*)(messageContext));
答案 1 :(得分: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 value = messageContent [0] * 256 + messageContent [0]
就像我告诉你45
thousands
和123
一样,所以你将你的号码建立为45*1000+123=45123
。 256是2 ^ 8,等于一个完整字节,b'1 0000 0000'。