问题提出
通常情况下,由上位机软件向底层硬件发送多个命令参数对硬件进行控制时,一般是将这些命令参数封装为结构体的形式进行处理的。如对于下图所示C语言中定义的包含多个参数的结构体形式如下:
而在Python语言中并没有直接提供结构体相关定义及操作方法,当使用Python编写上位机软件与底层硬件进行通信时,在Python中定义与C语言兼容的结构体是必须考虑的一个问题。
解决方法
对于这个问题,在Python中可以使用ctypes模块实现这个功能。在ctypes模块中,与结构体操作相关的操作,提供了三个抽象类,BigEndianStructure、LittleEndianStructure和Structure,分别对应了大端序、小端序及本地字节序的结构体。
在Python中定义与C语言的兼容的结构体时,必须以这三个抽象类作为基类进行定义。在这三个基类中,有两个变量是我们需要考虑重新定义的:
(1)“_fields_”:是一个列表,存储了结构体的所有参数。每个参数是一个2元或3元的元组形式,其中元组中第一个元素是字段的名称,第二个元素指定字段的类型,它可以是任何cType数据类型。
(2)“_pack_”:是一个可选的参数,定义了结构字段的对齐方式。注意,该变量必须在类的一开始就要定义,否则不起作用,目的是与C语言的结构体对齐方式完全一致。
实现代码
结合上面的思路,对于开始给出C语言定义的结构体CMDPara,下面给出Python中对应的具体实现代码。
上图定义了小端序的结构体类,若定义大端序、本地字节序的结构体类,只需将基类改为BigEndianStructure和Structure即可。
结构体类定义完成后,定义一个实例给其赋值即可创建与C语言兼容的结构体类,如:
当然也可以对结构体的每个参数单独赋值,如:
通过这种方式,可以在Python中创建与C语言完全兼容的结构体。
欢迎加关注,共同交流。
领取专属 10元无门槛券
私享最新 技术干货