首页 > 解决方案 > 通过串口发送位串

问题描述

我一直在试图弄清楚如何使用串行模块通过 python 3 发送位串。最初,当我尝试对其进行 serial.write 时,它​​正在发送 1 和 0 的 ascii 代码。我是 python 新手,没有找到任何有帮助的答案,尽管现在已经研究了几天并试图理解。我正在尝试通过串行端口将位串发送到 arduino,它将解释它们并将它们显示在 LED 矩阵上。任何帮助将不胜感激,谢谢。

标签: pythonpython-3.xarduinobitstring

解决方案


Serial 只知道 ,bytes 的概念,所以在发送前需要将位转换为字节。

如果你有一个像“01000001”这样的位串作为python字符串,你首先需要将它转换成一个int。您可以使用 int() 构造函数执行此操作,指定基数 2:

as_int = int("01000001", 2)  # = 65

然后你可以把它变成一个ASCII字符发送:

as_character = chr(as_int)  # = "A"

然后,您可以将字符发送到串行连接。

如果您有一个多于一个字节的位串,则需要将其分成 8 个一组,然后再将其转换为整数。例如:

bitstring = "0101010001101000011010010111001100100000011010010111001100100000011000010010000001101101011001010111001101110011011000010110011101100101"
string_array = [bitstring[i:i+8] for i in range(0, len(bitstring), 8)]
byte_string = bytes([int(s, 2) for s in string_array])

在这种情况下,我将它组装成一个字节串而不是一个普通的字符串,因为在 python3 中,pyserial 模块需要一个字节串。


这是一个列表理解较少的版本:

bitstring = "0101010001101000011010010111001100100000011010010111001100100000011000010010000001101101011001010111001101110011011000010110011101100101"

string_array = []
normal_string = ""

for offset in range(0, len(bitstring), 8):
    string_array.append(bitstring[offset:offset+8])

for string in string_array:
    value = int(string, 2)
    normal_string += chr(value)

byte_string = normal_string.encode("ASCII")

推荐阅读