【问题标题】:Test if a given bit is set in a byte测试给定位是否在一个字节中设置
【发布时间】:2022-07-15 06:14:16
【问题描述】:

我有一个 EasyDAQ 继电器板。要打开继电器 1,您发送一个字节,继电器 2,两个字节,继电器 3,四个字节,继电器 4,八个字节。所有继电器开启 = 15 个字节。要关闭继电器,您基本上必须从打开的继电器的字节总数中减去其字节数。因此,如果所有继电器都打开,电路板会以 15 个字节进行轮询。如果我想关闭继电器 3,我从 15 个字节中减去 4 个字节。这一切我都做过。我想要做的是根据从板上轮询的字节数判断继电器是否打开。例如,如果电路板以 11 个字节进行轮询,我知道继电器 3(4 个字节)未打开。我该如何计算?

    标签: python bitwise-operators pyserial bitmask bitwise-and


    【解决方案1】:

    我认为您对“字节数”和发送特定数量的“字节”的术语有点困惑。我假设正在发生的事情是您正在从板上读取一个值,该值是单个字节(由 8 位组成),其中各个位代表继电器的状态。因此,如果电路板以十进制(以 10 为基数)返回 15,二进制即 0b1111,如您所见,所有四个位都已设置,表示所有四个继电器都打开。 (“0b”表示数字是二进制的)

    假设这是真的,看看 pythons 的bitwise operators。特别是,如果您想测试是否设置了二进制 int 的特定位,您可以将其与 bitmask 逐位与,其中您关心的位设置为 1,其余为 0。所以你可以测试第三个继电器是否设置了类似的东西

    RELAY_3_BITMASK = 0b0100  #Third bit is set to one
    if value_from_board & RELAY_3_BITMASK:
        print("Relay 3 is on")
    else:
        print("Relay 3 is off")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2021-02-16
      相关资源
      最近更新 更多