我一直在尝试找出如何将某些c ++函数导入python。我让它们工作,直到其中一个功能需要其属性之一通过引用传递,而我不知道如何使它工作。 我一直在听这里的建议:https://stackoverflow.com/a/252473/7447849 直到我尝试了这个,它一直运转良好:
我具有以下c ++函数:
bool __stdcall I2CRead(int Instance, BYTE SlaveAddress, BYTE registerAddress, BYTE* ReadBuff, BYTE Length)
那是我尝试过的代码:
i2cread_proto = ctypes.WINFUNCTYPE (ctypes.c_bool, ctypes.c_int, ctypes.c_byte, ctypes.c_byte, ctypes.c_byte, ctypes.c_byte)
i2cread_Params = (1, "instance", 0),(1, "SlaveAddress", 0),(1, "registerAddress", 0),(1, "ReadBuff", 0),(1, "Length", 0), # (parameter direction (1 for input, 2 for output), parameter name, default value)
i2cread = i2cread_proto (("I2CRead", qsfp_lib), i2cread_Params)
readBuff = ctypes.c_byte(0)
if (i2cread(0, 160, address, readBuff, 1)==True):
print(readBuff)
else:
print('Could not read data')
此代码有效,但readBuff保留给定的默认值,而不是应更改的值。
我尝试使用byref(),但仍然无法正常工作(这给我一个错误的类型错误)。
关于我的任何见解可能做错了吗?我对Python不太熟练,所以也许我误会了一个概念
答案 0 :(得分:0)
未经测试。确保对参数使用正确的类型。
from ctypes import *
dll = WinDLL('dllname')
dll.I2CRead.argtypes = c_int,c_ubyte,c_ubyte,POINTER(c_ubyte),c_ubyte
dll.I2CRead.restype = c_bool
output = (c_ubyte * 256)() # Create instance of a c_ubyte array to store the output.
result = dll.I2CRead(1,2,3,output,len(output))