問題提出
使用Python寫上位機軟件時,若通過網(wǎng)口向硬件端發(fā)送命令參數(shù)對儀器進行控制,此時需要將多個參數(shù)打包為字節(jié)流數(shù)據(jù)后進行網(wǎng)絡傳輸,那么,在Python中怎樣將多個參數(shù)打包為字節(jié)流進行網(wǎng)絡傳輸呢?
如對于一個具體的例子,將下列參數(shù)打包成字節(jié)流通過網(wǎng)絡傳輸?shù)接布糠?,要求如下?/p>
- 整個包大小為64Byte
- 包頭為0X“FAA5 FBB5 FCC4 FDD5”
- 包尾為0X“5FA5 5FB5 5FC5 5FD5”
- 中間不足部分補0
- 所有參數(shù)皆為有符號整型數(shù)字,且初始值、占用字節(jié)數(shù)定義如下:
解決方法
對于這個問題,可以使用Struct、ctypes、socket等模塊完成,其具體步驟思路為:
1、用ctypes模塊創(chuàng)建64個字節(jié)大小的發(fā)送緩沖區(qū)sendBuffer,代碼如下:
2、用struct模塊,分別定義包頭(fmt_head)、包身(fmt_body,存儲待發(fā)的具體參數(shù))、包尾(fmt_tail)在字節(jié)流中的數(shù)據(jù)格式,代碼如下:
3、利用struct模塊的pack_into函數(shù)將待發(fā)內容打包到緩沖區(qū)sendBuffer,代碼如下:
其中,headInfo和tailInfo定義的是包頭、包尾的信息,即
4、通過socket模塊發(fā)送到服務器端,代碼如下:
備注說明
上面struct模塊中支持的格式如下圖所示:
打包的后的字節(jié)順序默認上是由操作系統(tǒng)的決定的,struct模塊提供了自定義字節(jié)順序的功能,可以指定大端存儲、小端存儲等特定的字節(jié)順序,對于底層通信的字節(jié)順序是十分重要,不同的字節(jié)順序和存儲方式也會導致字節(jié)大小的不同。在format字符串前面加上特定的符號即可以表示不同的字節(jié)順序存儲方式,例如采用小端存儲 s = struct.Struct(‘<I3sf’)就可以了。其對照列表如下:
版權聲明:本文內容由互聯(lián)網(wǎng)用戶自發(fā)貢獻,該文觀點僅代表作者本人。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如發(fā)現(xiàn)本站有涉嫌抄襲侵權/違法違規(guī)的內容, 請發(fā)送郵件至 舉報,一經(jīng)查實,本站將立刻刪除。