问题提出
使用Python写上位机软件时,若通过网口向硬件端发送命令参数对仪器进行控制,此时需要将多个参数打包为字节流数据后进行网络传输,那么,在Python中怎样将多个参数打包为字节流进行网络传输呢?
如对于一个具体的例子,将下列参数打包成字节流通过网络传输到硬件部分,要求如下:
- 整个包大小为64Byte
- 包头为0X“FAA5 FBB5 FCC4 FDD5”
- 包尾为0X“5FA5 5FB5 5FC5 5FD5”
- 中间不足部分补0
- 所有参数皆为有符号整型数字,且初始值、占用字节数定义如下:
解决方法
对于这个问题,可以使用Struct、ctypes、socket等模块完成,其具体步骤思路为:
1、用ctypes模块创建64个字节大小的发送缓冲区sendBuffer,代码如下:
2、用struct模块,分别定义包头(fmt_head)、包身(fmt_body,存储待发的具体参数)、包尾(fmt_tail)在字节流中的数据格式,代码如下:
3、利用struct模块的pack_into函数将待发内容打包到缓冲区sendBuffer,代码如下:
其中,headInfo和tailInfo定义的是包头、包尾的信息,即
4、通过socket模块发送到服务器端,代码如下:
备注说明
上面struct模块中支持的格式如下图所示:
打包的后的字节顺序默认上是由操作系统的决定的,struct模块提供了自定义字节顺序的功能,可以指定大端存储、小端存储等特定的字节顺序,对于底层通信的字节顺序是十分重要,不同的字节顺序和存储方式也会导致字节大小的不同。在format字符串前面加上特定的符号即可以表示不同的字节顺序存储方式,例如采用小端存储 s = struct.Struct(‘<I3sf’)就可以了。其对照列表如下:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。