【问题标题】: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")