自制虚拟现实示波器

看到网上很多人做了自制示波器,都是硬件实现的。最近学习了labwindows/cvi,所以萌生出自制一台串口示波器的想法。

下位机采用stm32,通过自带AD采集电压值,然后通过DMA传至串口,发送到上位机。

下面主要叙述一下上位机软件的设计。

利用CVI自带的控件库来创建界面。波形显示控件是stripchart。

软件启动时,自动配置串口:

OpenComConfig (comnum,"com6",115200,0,8,1,512,512);  //打开并配置串口,串口号为comnum(定义好了),波特率为115200


FlushInQ (comnum); //清除接收队列                                     
FlushOutQ (comnum); // 清除输出队列 

然后绑定串口回调函数(相当于调用串口中断)
InstallComCallback (comnum, LWRS_RECEIVE, 1, 0, Event_Char_Detect_Func, 0);    //绑定串口事件回调函数
然后开始写串口中断函数:
void CVICALLBACK Event_Char_Detect_Func (int portNo,int eventMask,void *callbackData)
{
	
    unsigned int strLen=GetInQLen(comnum),val;  //获取串口接收的数据缓冲区长度  
	x[0]=ComRdByte(comnum);
	
}	
	一般的示波器都有一个功能是调节时基周期。本项目中,也有这样功能。
	添加一个ringknob,把他的变量设置上特定的值:

然后在他的回调函数中将值附给一个全局变量(time_flag):

int CVICALLBACK timediv (int panel, int control, int event,
						 void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
			GetCtrlVal (panelHandle, PANEL_RINGKNOB_2, &time_flag);
			break;
	}
	return 0;
}
然后再创建四个定时器,分别给不同的值,回调函数如下:

int CVICALLBACK timer002 (int panel, int control, int event,
						  void *callbackData, int eventData1, int eventData2)
{
		int val;
	if(time_flag==2)
	{
			switch (event)
	{
		case EVENT_TIMER_TICK:
			
		
		GetCtrlVal(panelHandle,PANEL_BINARYSWITCH,&val);
	if(val)
	{
		PlotStripChartPoint(panelHandle,PANEL_STRIPCHART,x[0]/10);
		SetCtrlVal(panelHandle,PANEL_LED,1);   
	}
	 else
	 {
	 		   SetCtrlVal(panelHandle,PANEL_LED,0);   
	 }
			
			break;
	}
	}
	
	return 0;
}
	其他的功能还没有添加,等完善了再补。



你可能感兴趣的:(嵌入式,上位机)