0

我已经进行了相当多的搜索和阅读,但还没有找到一个确切的明确答案。我正在制作 python 应用程序,它将通过串行端口与另一个通信。我一直在使用 PySerial 来实现这一点。我要发送的数据包类型是状态信息和数据读数。我建议将我的数据包形成如下:

[ Start Byte ][ Length ][ Message ][ End Byte ][ Checksum ]

虽然我认为我不需要结束字节,因为那里有一个长度。我对么?

我正在考虑为状态信息塑造数据包的“消息”部分,如下所示:

[ MsgTypeID ][ PacketID ][ Status Bits ][ Timestamp ]

这里的消息ID只是为了区分这是一个状态包而不是数据包。状态信息本身由 16 位组成,代表发送应用程序中多个子系统的状态。对于其中一些子系统,单个位将提供足够的信息(“0”表示子系统关闭/低/假,“1”表示打开/高/真)。其他将需要 2 或 3 位(表示状态等)。对系统进行原型设计,我一直在简单地构建一个字符串,将这些位连接起来形成类似的东西'1001110101101100'并将其发送到串行端口,校验和是状态位的模 256。

我对 Python 和串行通信很陌生,但我知道这可能是对带宽的浪费。我知道 PySerial 必须发送字符串,但将每个位表示为“0”或“1”,就像这样对每个位使用完整的字符串表示。我想知道发送这些位以减少带宽的最佳方法是什么?

例如,我是否会采用每 8 位,将它们转换为十六进制并发送连接的十六进制字节,如下所示:

'10011101' + '01101100'

表示为

'\x9d' + '\x6c'

还是我应该将它们作为 ASCII 发送?我还看到提到 Struct 模块。我应该走那条路吗?

我想知道的另一件事是如何表示消息的时间戳部分。

任何帮助,您可以给我的建议将不胜感激。

非常感谢 :)

4

2 回答 2

0

好吧,显然每个发送的字符需要一个字节,所以如果您可以将数据编码为 ascii 字符串(str在 Python 2 中,bytes在 Python 3 中),那是最有效的。

struct模块绝对是个好主意:它将 Python 数据打包成一个字符串(并在另一端解包)。这适用于您的时间戳;将它们打包为任何类型的 int 或 long 似乎合适(请参阅链接文档以获取您的选项)。

但是,struct 不做单独的位,所以你必须自己做。我之前建立了一个字典来将字符转换为八个True/False值的组:

解码:

pot = [2**x for x in range(8)]  # Powers of 2 (bytes with one 1 and seven 0s)
bitvalues = {}
for x in range(256):
    bitvalues[chr(x)] = [(x & y) != 0 for y in pot]

要制作用于编码的字典,请将最后一行替换为:

bitvalues[tuple((x & y) != 0 for y in pot)] = chr(x)

如果您想从 1 和 0 的字符串编码/解码,请将生成列表/元组的位替换为:

"".join("1" if (x&y) else "0" for y in pot)
于 2010-12-01T19:05:31.580 回答
0

您希望多久发送一次这些更新?如果 update_frequency * length_of_message 远小于串行连接的数据速率,那么几乎没有理由担心数据编码的效率,您甚至可以考虑将其扩展为更易于阅读的格式,尤其是当您'正在开始。

于 2010-12-01T19:49:07.090 回答