前言:本篇介绍了如何通过串口通讯实现对GDM-906X万用表的上位机控制,由于小明还在对LabWindows/CVI的学习阶段,只是实现了对AC/DC电压电流和电阻的测量。
界面演示:
一、创建uir界面
新建CVI工程
点击File->new->user interface(*.uir)新建ui界面文件
以上创建了九个EditCommandButton,方法如下:
在窗口界面上右击选择CommandButton
双击所选按钮设置属性
依次给九个按钮设置不同的属性
注:其中按钮的回调函数都用了同一个(SignalCallBack),方便后续函数的编写。
创建显示框,也就是所读到的万用表上的数据,我选用的是EditTextBox,属性如下:
其次还创建了两个EditTextMessage消息框,用于显示在选择了测量方式之后的量程和属性显示。
二、自动生成代码
点击Code->Generate->AallCode
之后选择Yes即可命名工程名称,根据自己需要即可,然后点击Save保存
要插入生成的代码,必须指定目标文件,点击Yes
点击OK即可
之后选择工程的保存目录,点击OK即可
之后会出现新项目选项,点击OK即可
代码自动生成之后,大体框架就已经有了,现在要做的就是在之前所设定的回调函数和主函数中添加你所需要的功能代码。
编写打开串口函数
int CVICALLBACK ComOpen (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
//int comValue,btlValue,jhValue,longValue,stopValue;
int com = 4;
switch (event)
{
case EVENT_COMMIT:
//设置和打开串行口
status = OpenComConfig(4,"",115200,0,8,1,512,512);
if(status!=0)
{
MessagePopup("Error","config failed");
return 0;
}
//SetCTSMode(comValue,LWRS_HWHANDSHAKE_OFF); //禁止硬件握手
//清空输入和输出缓冲区
FlushInQ(com);
FlushOutQ(com);
comSelect = com;
DimObject(1);
break;
}
return 0;
}
因为我这里是直接设定的固定串口,就方便多了,直接使用cvi自带函数OpenComConfig();
串口关闭函数
int CVICALLBACK ComClose (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
switch (event)
{
case EVENT_COMMIT:
CloseCom(comSelect);
comSelect = 0;
DimObject(0);
break;
}
return 0;
}
编写回调函数,设置按钮发送文本
其中发送文本要查询GDM-906X使用说明书,查看SCPI协议
注:SCPI(可编程仪器的标准指令)指令遵循树型结构,组织成节点。指令树的每个级别都是一个节点。SCPI 指令中的每个关键字表示指令树中的每个节点。SCPI 指令的每个关键字(节点)都由冒号(:).分隔。
测直流电压:CONF:VOLT:DC 1,MAX
测交流电压:CONF:VOLT:AC
测直流电流:CONF:CURR:DC 10e-3,DEF
测交流电流:CONF:CURR:AC 10e-2
测2线电阻:CONFigure:RESistance
并使用函数openFile()将测量到的数据保存到txt文件当中
量程切换回调函数:
int CVICALLBACK SignalCallback (int panel, int control, int event,
void *callbackData, int eventData1, int eventData2)
{
char brr1[50] = "CONF:VOLT:DC 1,MAX\n";//直流电压
char brr6[50] = "CONF:VOLT:AC\n";//交流电压
char brr2[50] = "CONF:CURR:DC 10e-3,DEF\n";//测直流电流
char brr5[50] = "CONF:CURR:AC 10e-2\n";//测量交流电
char brr3[50] = "CONFigure:RESistance\n";//测量电阻
char brr4[10] = "READ?\n";
switch (event)
{
case EVENT_COMMIT:
if(control == PANEL_VDC)
{
ComWrt(comSelect,brr1,strlen(brr1));
//SetCtrlVal(PANEL,PANEL_SENDTEXT,brr1); //测量直流电压
ResetTextBox(PANEL,PANEL_RECIVETEXT,"\0");
SetCtrlVal(PANEL,PANEL_CHANGE,"DC Voltage");
SetCtrlVal(PANEL,PANEL_RANGECHANGE,"Range : 1V");
}
else if(control == PANEL_VAC)
{
ComWrt(comSelect,brr6,strlen(brr6));
//SetCtrlVal(PANEL,PANEL_SENDTEXT,brr6);//测量交流电压
ResetTextBox(PANEL,PANEL_RECIVETEXT,"\0");
SetCtrlVal(PANEL,PANEL_CHANGE,"AC Voltage");
SetCtrlVal(PANEL,PANEL_RANGECHANGE,"Range : 10V");
}
else if(control == PANEL_DC)
{
ComWrt(comSelect,brr2,strlen(brr2));
//SetCtrlVal(PANEL,PANEL_SENDTEXT,brr2); //测量直流电流
ResetTextBox(PANEL,PANEL_RECIVETEXT,"\0");
SetCtrlVal(PANEL,PANEL_CHANGE,"DC Current");
SetCtrlVal(PANEL,PANEL_RANGECHANGE,"Range : 10mA");
}
else if(control == PANEL_AC)
{
ComWrt(comSelect,brr5,strlen(brr5));
//SetCtrlVal(PANEL,PANEL_SENDTEXT,brr5);//测量交流电流
ResetTextBox(PANEL,PANEL_RECIVETEXT,"\0");
SetCtrlVal(PANEL,PANEL_CHANGE,"AC Current");
SetCtrlVal(PANEL,PANEL_RANGECHANGE,"Range : 100mA");
}
else if(control == PANEL_OUMU)
{
ComWrt(comSelect,brr3,strlen(brr3));
//SetCtrlVal(PANEL,PANEL_SENDTEXT,brr3);//测量电阻
ResetTextBox(PANEL,PANEL_RECIVETEXT,"\0");
SetCtrlVal(PANEL,PANEL_CHANGE,"2-wire OHM");
SetCtrlVal(PANEL,PANEL_RANGECHANGE,"Range : 1KΩ");
}
else if(control == PANEL_READ)
{
ComWrt(comSelect,brr4,strlen(brr4));
//SetCtrlVal(PANEL,PANEL_SENDTEXT,brr4);//读取数据
}
else if(control == PANEL_SAVE)
{
gLogFile = OpenFile("D:\\11.8\\ChuanKouPlus\\1.txt",VAL_READ_WRITE,VAL_APPEND,VAL_ASCII);
char str1[100];
char str2[100];
char str3[100];
GetCtrlVal(PANEL,PANEL_RECIVETEXT,str1);
GetCtrlVal(PANEL,PANEL_CHANGE,str2);
GetCtrlVal(PANEL,PANEL_RANGECHANGE,str3);
WriteLine(gLogFile,str2,strlen(str2));
WriteLine(gLogFile,str3,strlen(str3));
WriteLine(gLogFile,str1,strlen(str1));
memset(str1,0,sizeof(str1));
memset(str2,0,sizeof(str2));
memset(str3,0,sizeof(str3));
ResetTextBox(PANEL,PANEL_RECIVETEXT,"\0");
MessagePopup("MES","保存成功");
}
break;
}
return 0;
}
如有文中描述不清楚的,详情可见具体代码包: