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