将rs232消息保存到变量

时间:2013-11-07 19:17:50

标签: c++ serial-port arduino uart

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

这是如何运作的?

2 个答案:

答案 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 thousands123一样,所以你将你的号码建立为45*1000+123=45123。 256是2 ^ 8,等于一个完整字节,b'1 0000 0000'。