int CGPIB∷RecvData(void*Buffer,int& limitLength)
{ if(!(m_bOpened)||(m_dev==NULL))
return FALSE;
ibeot(m_dev,1);
ibtmo(m_ctrl,T3s);
ibtmo(m_dev,T3s);
ibrda(m_dev,Buffer,limitLength);
//从仪器异步读数据到Buffer
ibwait(m_dev,0x4100); //等待异步读完成
int nLocCount=ibcntl;
if(ibsta & ERR)
return FALSE;
ibwait(m_ctrl,0x0000);
if(ibsta & ERR)
return -1;
return nLocCount;
}
⑤关闭仪器的方法主要用于将仪器置为本地测量方式,同时使仪器处于离线状态。其关键代码如下:
BOOL CGPIB∷Close( )
{ if(!(m_bOpened)||(m_dev==NULL))
return TRUE;
ibloc(m_dev); //置ESVN40为本地测量方式
ibonl(m_dev,0); //置ESVN40为离线方式
if(ibsta & ERR)
return FALSE;
m_bOpened=FALSE;
ibonl(m_ctrl,0); //设置GPIB卡为OFF-Line状态
return 1;
}
3 程序运行界面
该系统可以进行无线电信号的监测,其中包括某个频点的电平、调整深度、频率补偿和频率偏移等。此外,系统还能对单频点的频谱进行分析,对给定的频段进行信号扫描。在实际应用中,采用双线程的工作机理,可以很大程度地提高数据采集的速度。系统对信号进行频率扫描时的运行界面如图4所示。在界面中,由于ESVN40只是返回扫描驻点的电平值,因此在软件中对该扫描功能进行了扩充。在界面上只要设定一个电平阈值(用户可以认为超过该阈值的电平,可能存在信道占用)和一个用户认为每个信道应该占用的最大带宽或法定的最大带宽,则通过软件设计对采样的样本进行分析后,可以对占用信道的中心频点进行初步定位。用户根据在测量结果表中显示的值,可以进一步分析该中心频点的频谱或测量其他的调制特征值。可见,通过虚拟仪器的思想,将软硬件结合使用,可以极大地扩充硬件的功能。
4 结束语
在系统的开发中,采用了C++中类的思想,使得系统具备了良好的扩展性,对于不同的仪器接口方式,可以最大限度地利用已开发的代码段。同时,也增强了系统的可维护性,在实际应用中取得了不错的效果。在采用了双线程工作机制后,充分发挥了仪器的性能,比单线程的速度提高了50%。