【发布时间】:2016-05-08 23:05:25
【问题描述】:
我正在构建一个从串行端口接收字节的 python 项目。这些字节是对发送的命令的响应(也通过串行端口)。响应没有识别标记,即仅从字节来看,我不知道这是哪个命令响应。解码器当然需要提前知道这是对哪个命令的响应。
我希望将传入的字节序列表示为嵌套对象,指示帧、标头、有效负载、解码的有效负载等。我更愿意一次将 1 个字节推送到解码器并让它调用一旦接收到足够完整对象的字节后回调(如果有错误或超时,则为 errorCallback)。
实际的帧有一个起始字节和一个结束字节。它有一个带有几个字节的标头(一些 id、命令状态(基本上是 ok/fail)),一个是数据长度字节。后面是数据,后面是校验和(单字节)。数据是对命令的响应。
响应是可预测的,因为前面的字节决定了接下来的字节的含义。
示例响应:
aa:00:0c:00:01:00:00:d3:8d:d4:5c:50:01:04:e0:6e:bb
分解:
aa: start frame
00: id
0c: data length (incl status): 12 bytes
00: command status (byte 1)
01: 1 data frame (byte 2)
00:00: flags of first data frame (byte 3-4)
d3:8d:d4:5c:50:01:04:e0: first data (aa and bb could be in it) (byte 5-12)
6e: checksum (includes all bytes except start, checksum, end bytes)
bb: end frame
这是串行端口通信,可能会丢失字节(并产生额外的字节),我希望使用超时来处理重置(如果没有先发送命令,则不会响应)。
我真的很想要一种面向对象的方法,其中解码器会产生一个对象,当序列化时,它会再次产生相同的字节序列。我使用的是 python 2.7,但实际上任何面向对象的语言都可以(只要我可以将其转换为 python)。
我只是不确定如何构建解码器以使其看起来整洁。我正在寻找一个完整的解决方案,只是让我朝着正确的方向前进(正确的方向在这里有些主观)。
【问题讨论】:
-
如果您发布一些代码,您更有可能得到对您的问题的积极回应。如果它不整洁,或者没有使用任何高级技巧,请不要担心。发布一些代码不仅表明您已经诚实地尝试自己解决问题,而且一段代码是一种非常有用的方式来准确显示您正在尝试做的事情。
-
您的意思是您只是希望将传入的固定长度响应解析为可以转换回字节的对象(带有属性)?
-
我确实有一些代码,但它太可怕了,实际上不能正常工作。此外,它并没有满足我将其模块化的愿望。 TisteAndii 下面的答案实际上比我的答案要好。
标签: python object serialization stream byte