小编Jac*_*ack的帖子

Python和Ctypes:将结构作为指针传递给函数以获取数据

我已经看过其他答案,但似乎无法让这个工作.我正在尝试调用DLL中的函数来与SMBus设备进行通信.该函数接受一个结构的指针,该结构有一个数组作为其中一个字段.所以...

在C:

typedef struct _SMB_REQUEST
{
    unsigned char Address;
    unsigned char Command;
    unsigned char BlockLength;
    unsigned char Data[SMB_MAX_DATA_SIZE];
} SMB_REQUEST;
Run Code Online (Sandbox Code Playgroud)

我想我必须在DLL填充数据数组时设置Address,Command和BlockLength的值.需要此结构的函数将其作为指针

SMBUS_API int SmBusReadByte( SMBUS_HANDLE handle, SMB_REQUEST *request );
Run Code Online (Sandbox Code Playgroud)

所以我在Python中设置了这样的结构:

class SMB_REQUEST(ctypes.Structure):
    _fields_ = [("Address", c_char),
            ("Command", c_char),
            ("BlockLength", c_char),
            ("Data", type(create_string_buffer(SMB_MAX_DATA_SIZE))]
Run Code Online (Sandbox Code Playgroud)

*注意:我也尝试过数据类型的ctypes.c_char*SMB_MAX_DATA_SIZE*

要将指向此类型结构的指针传递给函数,我首先尝试将其初始化,如下所示:

data = create_string_buffer(SMB_MAX_DATA_SIZE)
smb_request = SMB_REQUEST('\x53', \x00', 1, data)
Run Code Online (Sandbox Code Playgroud)

这回应:

TypeError: expected string or Unicode object, c_char_Array_32 found
Run Code Online (Sandbox Code Playgroud)

如果我尝试省略数据数组,如下所示:

smb_request = SMB_REQUEST('\x53', \x00', 1)
Run Code Online (Sandbox Code Playgroud)

不,错误.但是,当我尝试将此传递给函数时:

int_response =  smbus_read_byte(smbus_handle, smb_request))
Run Code Online (Sandbox Code Playgroud)

我明白了:

ArgumentError: argument 2: <type 'exceptions.TypeError'>: expected …
Run Code Online (Sandbox Code Playgroud)

python struct ctypes pointers

16
推荐指数
2
解决办法
3万
查看次数

标签 统计

ctypes ×1

pointers ×1

python ×1

struct ×1