3

我必须从 Matlab 中调用以下 C 库函数:

bool PI_OAD (int ID, const int* channel, const double* pdValueArray, int iArraySize)

并且参数 iArraySize 应该是数组通道和 pdValueArray 的大小。

参数 channel 和 pdValueArray 给出如下:

pChannel = uint8(channel);
pStep = uint16(step);

我的 calllib 命令是:

calllib(Controller, 'PI_OAD', ID, pChannel, pStep, int32(24));

它不起作用。

我不知道如何正确传递参数通道的大小和步进。有人有想法吗?谢谢!

编辑:感谢所有的答案,我会在下周二回来工作时尝试你的建议。

一些附加信息:

我需要函数 PI_OAD 来通过硬件接口操作压电元件,通道最多为 1,因为我只有一个轴,步长是我想在压电元件上设置的电压。

它不起作用意味着我从界面中得到一些错误。据我所知,我得到一个“命令太长”,然后是一个“未知命令”错误。

4

2 回答 2

1

您的代码中有一些错误:

  • channel被声明为int *,而您传递一个数组uint8
  • pdValueArray被声明为double *, 而你通过uint16

所以传递大小不是你的问题 - 传递其他变量是。

这是我写的一个简单的dll:

int PI_OAD (int ID, const int* channel, const double* pdValueArray, int iArraySize){
  int i; 
  mexPrintf("ID %d, size %d\n", ID, iArraySize);
  for(i=0; i<iArraySize; i++)
    mexPrintf("%lf ", pdValueArray[i]);
}

这是我从 MATLAB 中调用它的方式

lib = loadlibrary('libtestlib.so','testlib.h');

ID=int32(10);
pChannel = int32([1:10]);
pStep = double([1:10]);
calllib('libtestlib', 'PI_OAD', ID, pChannel, pStep, int32(numel(pChannel)));

unloadlibrary('libtestlib');

这是输出

ID 10, size 10
1.000000 2.000000 3.000000 4.000000 5.000000 6.000000 7.000000 8.000000 9.000000 10.000000 

一切正常!

于 2012-11-22T14:33:17.097 回答
0

您需要编写一个 MATLAB MEX-Wrapper,它是一个 C 函数,它将采用 MATLAB 定义的类型(通常是 mxArray)并将它们转换为正确的类型。

MEX 函数并不难编写,请参阅

http://www.mathworks.com/help/matlab/creating-cc-and-fortran-programs-to-be-callable-from-matlab-mex-files.html;jsessionid=874554659556527535e9ea9a084c

和:

http://www.mathworks.com/help/matlab/apiref/mexfunction.html

您可以在 MATLAB 文档中学习许多示例。他们中的许多人都接近你想要的。

于 2012-11-22T14:11:21.697 回答