⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sinwg.c

📁 LabWindows/CVI的USB采集测试程序
💻 C
字号:
#include <formatio.h>
#include <utility.h>
#include <visa.h>
#include <cvirte.h>		
#include <userint.h>
#include "sinwg.h"

int CVICALLBACK ThreadFunction (void* functionData);

static int panelHandle;
ViSession defaultRM, instr;
ViStatus  status;
int USB_Status=0;
int threadFlag=1,SaveFlag=0;
char FileName[300];
int fp;							//文件指针

int threadID;

int main (int argc, char *argv[])
{
	if (InitCVIRTE (0, argv, 0) == 0)
		return -1;	/* out of memory */
	if ((panelHandle = LoadPanel (0, "sinwg.uir", PANEL)) < 0)
		return -1;
	DisplayPanel (panelHandle);
	RunUserInterface ();
	DiscardPanel (panelHandle);
	return 0;
}

int CVICALLBACK PanelFun (int panel, int event, void *callbackData,
		int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_GOT_FOCUS:

			break;
		case EVENT_LOST_FOCUS:

			break;
		case EVENT_CLOSE:
			threadFlag=0;
			if (threadID) CmtWaitForThreadPoolFunctionCompletion (DEFAULT_THREAD_POOL_HANDLE,threadID , OPT_TP_PROCESS_EVENTS_WHILE_WAITING);
			status = viClose(instr);
			status = viClose(defaultRM);			
			QuitUserInterface (panel);
			break;
	}
	return 0;
}

int CVICALLBACK StartFunc (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	char a[2]={0};
	int b;
	ViUInt32 c;
	switch (event)
	{
		case EVENT_COMMIT:
			if (instr==0) return 0;
			
			GetCtrlVal(panel,PANEL_StartBtn,&b);
			if (b==1)
			{
				a[0]='S';
				a[1]='T';
				if (SaveFlag==1)
				{
					fp=OpenFile (FileName, VAL_WRITE_ONLY, VAL_TRUNCATE, VAL_BINARY);
				}
			}
			else
			{
				a[0]='E';
				a[1]='D';
				if (fp) CloseFile(fp);
				fp=0;
			}
			viWrite(instr,a,2,&c);
			
			break;
	}
	return 0;
}

int CVICALLBACK SaveCheckFun (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	switch (event)
	{
		case EVENT_COMMIT:
			GetCtrlVal(panel,PANEL_SaveCheck,&SaveFlag);
			break;
	}
	return 0;
}


int CVICALLBACK OpenDevFunc (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	int s,c;
	char desc[256]; 
	
	switch (event)
	{
		case EVENT_COMMIT:
			GetCtrlVal(panel,PANEL_OpenDev,&s);
			
			if (s==1)
			{
			status = viOpenDefaultRM(&defaultRM);		
			if (status < VI_SUCCESS)
			{
				MessagePopup ("错误", "打开失败!");
				SetCtrlVal(panel,PANEL_OpenDev,0);
				SetCtrlVal(panel,PANEL_USB_Status,0);
				USB_Status=0;
				return -1;
			}
			
			status = viFindRsrc(defaultRM, "USB[0-9]::0x3288::0x8515::NI-VISA-[0-9]::RAW", VI_NULL, VI_NULL, desc);		//搜索设备,仅匹配VID和PID
			if (status < VI_SUCCESS)
			{
				MessagePopup ("错误", "USB设备不存在!");
				SetCtrlVal(panel,PANEL_OpenDev,0);
				SetCtrlVal(panel,PANEL_USB_Status,0);
				USB_Status=0;
				return -1;					
			}
			
			status = viOpen(defaultRM, desc, VI_NULL, VI_NULL, &instr);				
			CmtScheduleThreadPoolFunction (DEFAULT_THREAD_POOL_HANDLE, ThreadFunction, &panel, &threadID);				//开启一个数据读取线程
			viWrite(instr,"ED",2,&c);			//令设备停
			//MessagePopup ("打开设备", desc);
			SetCtrlVal(panel,PANEL_USB_Status,1);
			USB_Status=1;
			}
			else								//关闭设备
			{
			status = viClose(instr);
			status = viClose(defaultRM);
			SetCtrlVal(panel,PANEL_USB_Status,0); 
			USB_Status=0;
			instr=0;
			defaultRM=0;
			}
			break;
	}
	return 0;
}

int CVICALLBACK ThreadFunction (void* functionData)
{
	char dat[1024],temp;
	int n,i;
	ViStatus  status;
	short int* pdat=(short int*)dat;
while(threadFlag)
{
	if (instr && USB_Status)
	{
		status=viRead(instr,dat,512,&n);
		for (i=0;i<n;i+=2)					//变小端序为大端序,只需交换高位和低位的数即可
		{
			temp=dat[i];
			dat[i]=dat[i+1];
			dat[i+1]=temp;
		} 
		if (status== VI_SUCCESS)
		{
			PlotStripChart (panelHandle,PANEL_STRIPCHART , (void*)dat, n/2, 0, 0, VAL_SHORT_INTEGER);
			if (SaveFlag && USB_Status)
			{
				WriteFile (fp, dat,n);
			}
		}
		
	}
}		
		
  return 0;
}

int CVICALLBACK SeleFileFunc (int panel, int control, int event,
		void *callbackData, int eventData1, int eventData2)
{
	int s;
	
	switch (event)
	{
		case EVENT_COMMIT:
			if (FileSelectPopup ("", "*.*", "dat", "选择文件", VAL_OK_BUTTON, 0, 0, 1, 0, FileName))
			{
				SetCtrlAttribute(panel,PANEL_SeleFileBtn,ATTR_LABEL_TEXT,"更改文件");
			}
			
			break;
	}
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -