2

我正在尝试使用 pyserial 发送和接收 rs232 数据,但我不明白如何正确发送正确的数据。我有什么小信息解释了数据字符串,并说它应该分成高半字节和低半字节。转换为小食是我没有得到的部分,我试图阅读它,但不知道如何在我的情况下使用它。

所以我有这个数据字符串要通过串行发送。10,00,00,00,00,00,16,0A,20,20,20,20,00,00,00,00,00,00,00,00,50

它说将字节分成高半字节和低半字节,然后将 21 个字节转换为 42 个字符的数据字符串。

有人可以帮我解释一下如何为我做这件事吗?

4

2 回答 2

10

如果您想获得一个字节的高半字节和低半字节。换句话说,将 8 位拆分为 4 位。

考虑到数据字符串是十六进制的字节字符串,那么您可以简单地执行以下操作:

high, low = byte[:1], byte[1:2]
print(high, low)

哪个 forbyte = "16"会打印1 6. 然后,您可以使用int(high, 16)andint(low, 16)将其转换为小数。

如果您已经将十六进制转换为十进制,int(byte, 16)那么您可以通过执行以下操作提取高半字节和低半字节:

high, low = byte >> 4, byte & 0x0F
print(hex(high), hex(low))

哪个 forbyte = 0x16会打印0x1 0x6,因为它们使用hex(x). 请注意,hex(x)添加一个0x前缀。您可以通过执行删除它hex(x)[2:]

因此,将您的数据字符串视为:

bytes = "10,00,00,00,00,00,16,0A,20,20,20,20,00,00,00,00,00,00,00,00,50"

然后打印每个高半字节和低半字节可以通过以下方式完成:

bytes = "10,00,00,00,00,00,16,0A,20,20,20,20,00,00,00,00,00,00,00,00,50"
bytes = bytes.split(",")

for byte in bytes:
    byte = int(byte, 16)
    high, low = byte >> 4, byte & 0x0F

    print(hex(byte), hex(high), hex(low))

这产生了十六进制的字节,高半字节和低半字节。

此外,如果你有它的位("{0:08b}".format(byte)),那么你可以像这样拆分它high, low = bits[:4], bits[4:8],现在high, low每个都有它们的 4 位。

于 2017-03-21T08:12:43.193 回答
2

我不知道现在的答案是否对您有所帮助,但您也可以使用所谓的位掩码解决此问题

例如,使用 python 将每个字符从字符串中的高半字节 (hl) 和低半字节 (ln) 中拆分出来:

input_text = "a fucking amazing input text"
for c in input_text:
  print(bin(ord(c)))
  nh = ord(c) & 0x0F
  nl = ord(c) >> 4 & 0x0F
  print("nh: " + bin(nh))
  print("nl: " + bin(nl))

为什么是0x0F,它是00001111

例如:

掩码:00001111 (0x0F) 值:11010101 结果:00000101

希望这仍然有帮助。

于 2020-04-16T18:47:00.650 回答