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