【问题标题】:Saving a rs232 message to a variable将 rs232 消息保存到变量
【发布时间】:2013-11-07 19:17:50
【问题描述】:

如果我通过 RS232 收到一条包含 2 个字节长度的消息,例如0000 0001 0001 1100(即100011100,右边的lsb),我想把它保存到一个叫做value的变量中。

我正在通过这一步“解码”字节流:

rxByte = Serial1.read()

messageContent[0] = rxByte

messageContent[1] = rxByte

第一个 rxByte 的值为 0000 0001,第二个 rxByte 的值为 0001 1100。 或者这些值是否已经在内部转换为 HEX 或 DEC?

现在我看到了以这种方式将其保存为值的代码:

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

这是如何工作的?

【问题讨论】:

    标签: c++ serial-port arduino uart


    【解决方案1】:

    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
    

    Works find,但取决于您机器的字节序,它相当于:

     uint32_t value = *((uint16_t*)(messageContext));
    

    【讨论】:

      【解决方案2】:

      解码过程:

      //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'。

      【讨论】:

      • " 你建立你的号码为 45*1000+123=45123 " 我明白为什么,但不明白如何......所以计算机总是知道,“*256”是十进制的?它也可以是十六进制,然后位移将不起作用。对于您的第一点:当然,每次迭代都会生成 rxbyte=Serial1.read(),它只是为了展示我是如何做到的。
      • C 编译器规则将(在您的 C 源代码中)写入的内容定义为十进制 (255)、十六进制 (0xff) 或八进制 (0377)。
      猜你喜欢
      • 1970-01-01
      • 2018-09-01
      • 2022-01-17
      • 2013-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多