通过串口通讯实现LabWindows/CVI对GDM-906X万用表的上位机控制

本文介绍了如何使用LabWindows/CVI通过串口通讯控制GDM-906X万用表,实现了AC/DC电压电流和电阻的测量。作者创建了UI界面,设置了CommandButton和EditTextBox,并利用SCPI协议发送测量命令。同时,文章展示了如何打开和关闭串口,以及读取数据并保存到TXT文件中。
摘要由CSDN通过智能技术生成

前言:本篇介绍了如何通过串口通讯实现对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即可

代码自动生成之后,大体框架就已经有了,现在要做的就是在之前所设定的回调函数和主函数中添加你所需要的功能代码。

  1. 编写打开串口函数

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();

  1. 串口关闭函数

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;
}
  1. 编写回调函数,设置按钮发送文本

其中发送文本要查询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;
}

如有文中描述不清楚的,详情可见具体代码包:

通过串口通讯实现LabWindows/CVI对GDM-906X万用表的上位机控制

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值