自学内容网 自学内容网

基于QT和Visa的安捷伦(keysight)34970A温度采集

在以前的文章中,描述了如何在labview开发读取34970A仪器采集的温度。

也描述了如何安装keysight IO Libraries Suits.

那么本文更进一步,描述QT平台c++语言开发软件,读取34970A仪器采集的温度。

以下是c++代码,因为采集耗费时间长,所以用线程的方式。

本文代码在qt6.2.4 MSVC2019调试成功,稳定运行。

1.头文件,文件名:sampletemp_thread.h

#ifndef SAMPLETEMP_THREAD_H
#define SAMPLETEMP_THREAD_H
#include    <QThread>
#include <QDebug>
#include "..\visa\visamanager.h"
#include <QCoreApplication>
#include <QString>
 

class SampleTemp_Thread: public QThread
{
    Q_OBJECT
private:
    int     m_seq=0;        //掷骰子次数序号
    QString m_string;       //读到的字符
    bool    m_paused=true;  //暂停次骰子
    bool    m_stop=false;   //停止线程run()
    QString * Temp_str=nullptr;

protected:
    void    run();      //线程的事件循环
public:
    void    Begin();    //开始
    void    Pause();    //暂停
    void    stopThread();   //结束线程run()
    explicit SampleTemp_Thread(QObject *parent = nullptr);

     ~SampleTemp_Thread();
signals:
    void  SendTempNewValue(int seq,QString str);    //产生新值的信号
    
private slots:
    void ChangeState(QString cmd);
};

#endif // SAMPLETEMP_THREAD_H

2.cpp文件,文件名:sampletemp_thread.cpp

#include "sampletemp_thread.h"

SampleTemp_Thread::SampleTemp_Thread(QObject *parent)
    : QThread{parent}
{

}
void SampleTemp_Thread::Begin()
{ //开始
    m_paused=false;
}
SampleTemp_Thread::~SampleTemp_Thread()
{
    vmanger->close();
}
void SampleTemp_Thread::Pause()
{//暂停
    m_paused=true;
}

void SampleTemp_Thread::stopThread()
{//停止线程
    m_stop=true;
}
void SampleTemp_Thread::run()
{//线程的事件循环

    m_stop=false;       //启动线程时令m_stop=false
    //m_paused=true;
    m_seq=0;            //次数
    VisaManager vmanger1("ASRL7::INSTR");//初始化,设定visa地址,安装keysight IO Libraries Suits后可以得到
    vmanger1.openDevice();
    vmanger1.write("*IDN?\n");//这行必须要,否则软件可能崩溃,询问示波器的产品信息,可以得到厂家、型号、序列号、固件版本等
    QThread::msleep(2000);
    QString str;
    vmanger1.read(str);
    qDebug()<<str;
    vmanger1.write("CONF:TEMP TC,DEF, (@201:215)\n");//写配置

//接着上一行,SCPI命令,TC表示热电偶,J表示J型,@201:215通道的起始和结束编号

           //接上行,注意包含两个空格,“TC” 字符前有一个,"("前有一个

    QThread::msleep(1000);
    while(!m_stop)      //循环主体
    {

        if (!m_paused)
        {
            qDebug()<< Q_FUNC_INFO ;
            vmanger1.write("MEAS:TEMP? TC,J, (@201:215)\n");//写多通道采集温度命令

            //接着上一行,SCPI命令,TC表示热电偶,J表示J型,@201:215通道的起始和结束编号

           //接上行,注意包含两个空格,“TC” 字符前有一个,"("前有一个
            QThread::msleep(500);
            Temp_str=new QString();
            vmanger1.read(*Temp_str);//读多通道温度
            m_seq++;
            QString str2=*Temp_str;
            delete Temp_str;
            Temp_str=nullptr;
            QThread::msleep(1000);
            //qDebug()<<str2;
            emit SendTempNewValue(m_seq,str2);  //发射信号
            
        }
        else
        {
            qDebug()<< Q_FUNC_INFO <<"void SampleTemp_Thread::run() in pause";
        }
        msleep(3500);    //线程休眠500ms
    }

    //  在  m_stop==true时结束线程任务
    vmanger1.close();
    quit();     //相当于exit(0), 退出线程的事件循环
}
void SampleTemp_Thread::ChangeState(QString cmd)
{
    if(cmd=="begin")
    {
        Begin();
    }
    else if(cmd=="pause")
    {
        Pause();
    }

}
 


原文地址:https://blog.csdn.net/weixin_39926429/article/details/136345148

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!