VC++单片机虚拟仪器测试系统 第14页
TYPE:数据采集模式;0表示正常模式,1表示PEAK模式,2表示平均模式,用一个整数表示(有指令:ACQUIRE:TYPE来进行设置)
POINTS:数据传送的个数
COUNT:该参数常为1
XINCREMENT:该参数是指当前的通道源的时间增益(在两个连续数据之间)
XORIGIN:在内存中的第一个数据值
XREFERENCE:与X-ORIGIN相联系的数据点的索引值,该值经常是0
YINCREMENT: 该参数是指当前的通道源的电压增益(在两个连续数据之间)
YORIGIN: 该参数是指当前的通道源的Y的原点值
YREFERENCE:该参数指的是Y-ORIGIN起点的数据值
只有正确的读回引导数据才能结合下面的波形数据进行计算出真正的实际波形数据值。
通过指令:waveform:data?来查询采样回来的二进制数据块(使用ieee488.2任意数据块格式)。通过指令:waveform:unsigned,:waveform:byteorder,:waveform:format 中的任意一个指令来对二进制数据进行格式化操作。而该数据点的个数是由指令:waveform:points来进行设定的。该二进制数据块由两个部分组成:<header><waveform data block><nl>
举个例子:<header>=#800002048 ”#8”会从头部去掉,而留下数值部分,表示波形数据块的字节的个数。该参数是会变的(根据指令:waveform:points来设置数据点的采样的个数)。从示波器中读取数据直至读回结束符为止。下面给出了读取引导数据和波形数据的部分代码:
ViStatus error;
viPrintf(/*oscillograph*/m_Session,":ACQ:COMPLETE 100\n");
viPrintf(/*oscillograph*/m_Session,":wave:points 2000\n");
viPrintf(/*oscillograph*/m_Session,":DIGITIZE %s\n",osciset.m_Channel);
//************************************preamble的采集***************************************
viPrintf(/*oscillograph*/m_Session,":waveform:preamble?\n"); error=viScanf(/*oscillograph*/m_Session,"%f,%f,%f,%f,%f,%f,%f,%f,%f,%f\n",&preamble[0],&preamble[1],&preamble[2],&preamble[3],&preamble[4],&preamble[5],&preamble[6],&preamble[7],&preamble[8],&preamble[9]);
if(error!=VI_SUCCESS)
{error_handler(/*oscillograph*/m_Session,error);return;}
//************************************数据点的采集部分**************************************
//利用字符转换符和viScanf函数来进行读取数据并定义一个无符号的字符数组来对读//取的数据进行存储--随后进行数据
//**************************************的转换和数据的处理---2005/5/17
viPrintf(/*oscillograph*/m_Session,":waveform:data?\n");
unsigned char temp[2000];
for(int i=0;i<2000;i++)
{ error=viScanf(/*oscillograph*/m_Session,"%c",&temp[i]);
if(error!=VI_SUCCESS)
{error_handler(/*oscillograph*/m_Session,error); return;}
}
//*****************************************数据的转换*****************************************
int j=0;
for(i=18;i<2000;i+=20,j++)
{ temp[j]=(int)temp[i];
n++;//数据的个数 }
数据采集这一块我花了不少的时间,不断的对指令进行测试,但是以为只要通过:waveform:data?指令然后进行读取就OK了!!然而,查看资料才晓得示波器采集回来的数据是想前面所示的那样,有头部数据以及二进制数据块,这就把我给难住了!二进制数据该怎么读呢??从安捷伦网站上下载下来的资料中虽然提供了怎样进行波形数据的读取的方法,但它并没有给出在VISA情况下的数据的读取的方法。但是它也给了我一定的提示:头部给出了数据块的字节的个数,既然是字节,也就是一个字符。那么这样的话就可以读取数据了。然后经过我的测试,一切OK!我好高兴~~~~~
读回数据之后,就是数据的显示问题。至于这个我采用了别人给我的一个类,通过该类我可以比较轻松的进行数据的显示工作。我只要将读回的波形数据进行处理,并将数据传递给给类的一个数组就可以了!!
//*****************************************数据的转换*****************************************
int j=0;
for(i=18;i<2000;i+=20,j++)
{ temp[j]=(int)temp[i];
n++;//数据的个数 }
//*****************************************数据存储*******************************************
for(int k=0;k<n;k++)
{ m_Static.wave_data[k]=(((float)temp[k]-preamble[9])*preamble[7]+preamble[8])*m_Y;//这里使用Y
} Invalidate();//这个用于屏幕画面的刷新
两大问题的解决,示波器也就基本上可以告一个段落了!!其他的功能的实现相对来说要容易的些!
下面是示波器显示窗口部分初始化代码:
//*******下面是另外一种方法---更方便控制示波器的显示的尺度,也就是在对话框模板上//添加一个静态控件,并调节它的尺度到你需要的范围,并最好是更改一下它的ID,然//后通过下列语句来进行创建显示
CRect m_nRect;
CStatic* pStatic=(CStatic*)GetDlgItem(IDC_STATIC_SHOW);
pStatic->GetClientRect(&m_nRect);
m_Static.SubclassDlgItem(IDC_STATIC_SHOW,this);
m_Static.m_rect=m_nRect;
m_Static.m_nStaticLeft=m_nRect.left+20;
m_Static.m_nStaticTop=m_nRect.top+15;
m_Static.m_nStaticRight=m_nRect.right-3;
m_Static.m_nStaticBottom=m_nRect.bottom-16;
在基本的问题解决之后,希望对于显示在示波器上的波形具有缩放功能,使自己的示波器更完美。于是就添加了两个Slider控件来控制波形的拉伸,起初的设计就是刷新窗口的问题:因为通过滑块来改变XY的值,但需要它能及时的在窗口上得到响应,这个问题使我有点头痛。起初的设计比较的粗糙,通过鼠标的点击消息来进行对整个窗口的刷新。不过,这样的设计实在是太难看了,后来,通过上网咨询,论坛的朋友建议我使用线程函数进行对特定的窗口进行刷新。于是,我开始接触线程,并去了解线程,并通过书本上的例子的练习,加深了解以及和同学进行探讨,终于将问题得以解决。具体代码见附录,下面是线程函数的代码:
static CEvent g_End;//事件对象的建立
struct data //需要传递的数据
{ CRect rect;
COSCILLOGRAPH* dlg;
CStatic* m_pCS;
}m_Data;
//***************************关键的线程函数
UINT ThreadProc(LPVOID param)
{ if(::WaitForSingleObject(g_End,0)==WAIT_OBJECT_0)//该语句用来判断是否挂起或结束线程
{ data* p=(data*)param;
//这里是针对指定控件如静态控件的刷新,相对对话框的刷新,这种刷新不会出现闪屏问题
<< 上一页 [11] [12] [13] [14] [15] [16] 下一页
VC++单片机虚拟仪器测试系统 第14页下载如图片无法显示或论文不完整,请联系qq752018766