发表于:2004-02-14 22:04:00
3楼
生成一个C源文件(data9118.c)
上面说的某种格式,指的是MATLAB约定的调用接口。我们知道,在DOS编程,C语言的入口叫main,在WINDOWS编程中C语言的入口叫WinMain,与MATLAB的接口叫mexFunction。
void mexFunction(int nlhs, mxArray *plhs[],
int nrhs, const mxArray *prhs[])
{
double *y;
long iCount, iFs;
if(nrhs!=2)
mexErrMsgTxt("Usage: data9118(iCount, iSampleRate)");
else if(nlhs!=1)
mexErrMsgTxt("Need one array for output!");
iCount=mxGetScalar(prhs[0]);
iFs=mxGetScalar(prhs[1]);
plhs[0]=mxCreateDoubleMatrix(iCount, 1, mxREAL);
y=mxGetPr(plhs[0]);
data9118(y, iCount, iFs);
}
在调用接口中,nlhs指的是在调用函数时返回值的个数,plhs[]是每个返回值(在MATLAB中都是矩阵)的指针;nrhs指的是调用函数时的参数个数,prhs[]是每个参数的指针。在上例中,我们会传两个值进来iCount为采样点数,iFs为采样频率。返回值为prhs[0],在这里是一个iCount元素的矩阵。我们把这个矩阵的地址取到,并把它作为采样函数的参数。采样函数如下:
void data9118(double *y, long iCount, long iFs)
{
int i;
U16 ad_data;
data_size=iCount;
sample_rate=iFs;
card=Register_Card(PCI_9118DG, 0);
if(card<0)
mexErrMsgTxt("Error Initialing card!");
mem_size=data_size*2;
hMem = GlobalAlloc(GMEM_ZEROINIT,mem_size);
if(hMem==0)
mexErrMsgTxt("Not Enough Memory!");
ai_buf = GlobalLock(hMem);
if (ai_buf == 0)
mexErrMsgTxt("Not Enough Memory!");
GlobalFix(hMem);
AI_9118_Config(card,P9118_AI_BiPolar|P9118_AI_SingEnded,0,0,0);
AI_ContScanChannels (card, channel, range, ai_buf, data_size,
(F32)sample_rate, SYNCH_OP);
for(i=0; i<data_size; i++)
{
ad_data=ai_buf[i];
y[i]=5.0*((ad_data>>4)-2048)/2048.0;
}
if(card>=0)
Release_Card(card);
if(hMem!=0)
{
GlobalUnfix(hMem);
GlobalUnlock(hMem);
GlobalFree(hMem);
}
return;
}