Matlab 调用 c++的动态库一般用两种方法,一种是用 Loadlibrary 的方法,一种是用 mex 技
术的方法。由于用 Loadlibray 的方法直接调用会出现很多问题,因为 Matlab 的结构体和指
针的用法不是很强大,发送数据会错乱和接收数据显示不出来等。因此,现在提供的
Demo 用 mex 技术来做。
所为 mex 技术,写一个 cpp 文件,这个文件里一定有一个函数 mexFunction,这个函数作为
Matlab 与 c++动态库的接口。例如
#include "mex.h"
#include"ControlCAN.h"
#pragma comment(lib,"ControlCAN.lib")
void mexFunction(int nlhs,mxArray *plhs[],int nrhs, const mxArray *prhs[])
{
if( nrhs != 3)
{
mexErrMsgTxt("输入参数个数不对!");
return;
}
nlhs=2;
double p1 = *((double*)mxGetPr(prhs[0]));
double p2 = *((double*)mxGetPr(prhs[1]));
double p3 = *((double*)mxGetPr(prhs[2]));
plhs[0]=mxCreateDoubleMatrix(1,1,mxREAL);
double *output1 =(double*)mxGetPr(plhs[0]);
*output1=VCI_OpenDevice(p1,p2,p3);
}
其中#include "mex.h" 一定要。第二第三行是加载动态库,mexFunction 是接口函数,参数
nlhs 是参数个数,plhs 是输入参数,nrhs 输出参数个数,prhs 输出参数。
P1,p2,p3 是输入参数,output1 是输出参数。
这个文件写完后把它放在 Matlab 的 Work 工作目录里,然后在 Matlab 的命令行里输入 mex
–setup 和 mbuild –setup 进行编译环境设置。设置为 VC6.0 的编译环境。
一切就绪后,在命令行里输入 mex VCI_OpenDevice.cpp.就生成一个 VCI_InitCAN.mexw32
的文件(如果是 64 位系统会生成 VCI_InitCAN.mexw64)。这样我们在命令行或 M 文件
里调用 VCI_OpenDevice(4,0,0),返回 1 就可以调用成功。
由于原来的动态库里需要传递或返回结构体数组指针,这在 Matlab 里极不方面,因此在
Mex 文件里改成用数组或矩阵来传递,这样在 Matlab 里面很方便调用,而且提高了效率。
注意VCI_Transmit(DEVICETYPE,DEVICEINDEX,CANINDEX, Frames,SendNums);
第四个参数Frames其实是一个n*18的矩阵,其中一行代表一帧,n是要发送的帧数。
下面说说每列和原来的VCI_CAN_obj结构体的对应关系:
第一列 ID
第二列TimeStamp
第三列TimeFlag
第四列SendType
第五列RemoteFlag
第六列ExternFlag