我正在構建一個從串行端口接收字節的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