struct包的主要作用就是将Python中的值对象和原生字节数据之间转换。主要应用场景是把数值转换为字节流以供与外部源进行数据交换、数据传输使用。

我们的主要目的是将一些数值对象打包到字节流缓冲区通过串口发送出去,然后将返回的字节数组按照协议解析成对应的值对象。要完成这个过程我们其实只需要packunpack 两个函数。

假设我们的串口接受一个6字节的命令包用以控制电机的转速,头两个字节为16位无符号整形数值表示的速度、中间两个字节是要定位的位置,而命令包尾部以\r\n 结尾。

例如我们需要发送以速度为20,运行到2000位置的命令的实现代码如下

import struct

struct.pack('<hh2s', buff, 20, 2000, b'\r\n') 

输出结果如下:

b'\x14\x00\xd0\x07\r\n'

或者我们可以首先开辟一块bytearray 缓冲区,往缓冲区里写数据

import struct

buff = bytearray(6)
struct.pack_into('<hh2s', buff, 0, 20, 2000, b'\r\n') 

输出结果如下:

bytearray(b'\x14\x00\xd0\x07\r\n')

接下来介绍解包功能,我们使用上文中生成的buff 缓冲区作为需要解包的字节流

import struct
buff = bytearray(b'\x14\x00\xd0\x07\r\n')
spd, pos, flag = struct.unpack('<hh2s', buff)
print(spd, pos, flag)

输出结果如下:

20 2000 b'\r\n'

相应的,我们也可以使用unpack_from来解析特定索引的数据,以跳过一些不需要的内容。例如我们仅需要解析所在位置的值。

import struct
buff = bytearray(b'\x14\x00\xd0\x07\r\n')
struct.unpack_from('<h', buff, 2)

输出结果如下

(2000,)

更多内容可以参考Python的库文档:struct -- 将字节串解读为打包的二进制数据