我正在构建一个从串行端口接收字节的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
我确实有一些代码,但它很可怕,实际上并没有正常工作。另外,它并没有满足我的愿望,使它成为模块化的。 TisteAndii下面的答案实际上比我的要好。 – galmok