2010-12-01 68 views
0

我已經做了一些搜索和閱讀,但沒有找到確切的答案。我正在製作python應用程序,它將通過串口與另一個進行通信。我一直在使用PySerial來實現這一點。我想發送的數據包的類型是狀態信息和數據讀數。 我建議,形成我的包如下: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模塊的提及。我應該去那條路線嗎?

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

任何幫助,建議你可以給我將不勝感激。

非常感謝:)

回答

0

嗯,很明顯它需要發送每個字符一個字節,所以如果你能(在Python 3 Python 2中,bytesstr)編碼數據爲ASCII字符串,這是最有效的。

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) 
+0

感謝您的回覆托馬斯。 – Jack 2010-12-01 19:31:34

+0

@傑克:不客氣。你能做你想做的事嗎? – 2010-12-01 19:33:17

0

您期望發送這些更新的頻率如何?如果update_frequency * length_of_message遠小於串行連接的數據速率,那麼幾乎沒有理由擔心數據編碼的效率,甚至可能會考慮將事物擴展爲更易讀的格式,特別是當您正在開始。

相關問題