在以前的文章中,描述了如何在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();
     }
}