1

我正在尝试使用 pyueye 通过 python 访问我的 IDS 相机的 GPIO。原函数定义为:INT is_IO(HIDS hCam, UINT nCommand, void* pParam, UINT cbSizeOfParam)。这是一个使用示例:

Example 2

INT nRet = IS_SUCCESS;

 

IO_GPIO_CONFIGURATION gpioConfiguration;

 

// Set configuration of GPIO1 (OUTPUT LOW)

gpioConfiguration.u32Gpio = IO_GPIO_1;

gpioConfiguration.u32Configuration = IS_GPIO_OUTPUT;

gpioConfiguration.u32State = 0;

 

nRet = is_IO(hCam, IS_IO_CMD_GPIOS_SET_CONFIGURATION, (void*)&gpioConfiguration,

            sizeof(gpioConfiguration));

我正在尝试在 python 中执行以下操作:

from pyueye import ueye
from ctypes import pointer
gpioConfiguration = ueye.IO_GPIO_CONFIGURATION 
gpioConfiguration.u32Gpio = ueye.IO_GPIO_1
gpioConfiguration.u32Configuration = ueye.IS_GPIO_OUTPUT
gpioConfiguration.u32State = 1

pt = pointer(gpioConfiguration)
stat = ueye.is_IO(hCam, ueye.IS_IO_CMD_GPIOS_SET_CONFIGURATION,byref(gpioConfiguration),ueye.sizeof(gpioConfiguration))

但我收到错误:TypeError:类型必须有存储信息。关于我需要改变什么的任何想法?

4

1 回答 1

0

该错误实际上是由您的调用引发的,ctypes.pointer而不是pyueye. 具体来说,gpioConfiguration是一个_ctypes.PyCStructType而不是一个实例。(这就是“必须有存储”的意思,也就是说,在获得指向它的指针之前,您实际上必须存储看起来像该结构的东西。这可能来自 c++,但 ctypes 认为结构是比如你必须实例化的类。文档

所以如果你真的需要一个指针,你必须这样做:

myConfig = gpioConfiguration()
pt = pointer(myConfig)
# you probably want to set properties on the *instance*:
myConfig.u32Gpio = ueue.IO_GPIO_1
myConfig.u32State = 1
# and then use this instance later when passing `byref`

如果您只需要通过引用传递这些参数,请参阅byref部分(尽管这也需要一个实例)。

遗憾的是,我没有相机可以进行测试(它们看起来很有趣),所以我只能做到这一点。但希望你能得到ueye为你表现的语义。

顺便说一句,你在 python 中不需要分号(不像在 JS 中你真的不需要,而且没有人认为你应该把它们放进去)

于 2021-09-20T10:25:35.200 回答