📄 sinwg.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 + -