最近编写一个读取 keySight 34401A 万用表的一个程序,使得每秒读取一个电压值,然后记录电压值到文本中去,也许对你来说,这还不简单吗? 通过232读取数据而已,很简单的呀,可能对于我这刚接触这个机器,而且最初没有任何资料的我来说算是一个小挑战吧。

实物如下图:

这个万用表一般有两种方式的编程,一种是GPIB 另一种是RS-232,这里使用的232编程,有关GPIB大家可以尝试一下。

首先我们要配置下这个万用表

主要是:

点击shift,然后点击 < 然后找到 ,上面的值,按 V 可以选择对应的东西:

1 GPIB设置为 31 Trlk  only。 这样万用表才会给你发数。

2  INTERFACE 改成 RS-232

3  RS-232 的波特率我设置为了9600

4 我选的 无,8bit 的RS-232

5.LANGUAGE  我选择了SCPI (232只能使用这个语言)

在详细的请看中文手册,需要手册的可以关注我私信我。

下面是连线的部分。

本人使用的是232串口盒子,与一条线,这个线是下面的接法,必须9个都要连接,本人试过235连接法,不行的。

这样你电脑连接串口盒子,串口盒连接到这个线,这个线与设别连接就可以了。

这样链路就是同的,使用一个串口软件开始测试,选择对应数据,打开后,设备会自动会给你发数据,发过来的是字符串:

这样算是成功一大半了,剩下的不就是程序了吗,QT有关的串口通讯我以前博客又详细的讲解,可以看看我之前的例子。

界面布局:

话不多说上代码吧:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QCloseEvent>
#include <QFile>
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();public:/* 初始化CombBox控件 */void InitCommCmb();         // 初始化CombBox控件void SetPortNumCmb();       // 设置串口号QStringList GetEnableCommPortQt();      // 获取计算机可用串口 Qt方式void SetBaudCmb();          // 设置波特率void SetDPaityCmb();        // 设置校验位void SetDataBCmb();         // 设置数据位void SetStopBCmb();         // 设置停止位bool SetSerialPortParam(QSerialPort *serial);   // 设置串口参数,失败返回false,成功返回true/* 父类函数重写 */void closeEvent(QCloseEvent *event);void timerEvent(QTimerEvent *event);
private slots:void on_btn_start_clicked();void on_btn_stop_clicked();private:bool m_bOpen;                 // 标识串口状态QSerialPort *m_serial;        // 串口通信类对象qint64 m_nReadBuffSize;       // 串口缓冲区大小int Timer;QString getNum;QFile aFile;int rec = 0;  //第一次获取的数据要去掉
private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H

对应的cpp文件:

#include "mainwindow.h"
#include "ui_mainwindow.h"#include <QSettings>
#include <QMessageBox>
#include <QTime>
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);setWindowTitle("加表电压采集程序");this->setFixedSize(this->width(), this->height());ui->btn_stop->setEnabled(false);InitCommCmb(); //初始化数据m_bOpen = false;m_serial = new QSerialPort;m_nReadBuffSize = 500;}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::InitCommCmb()
{SetPortNumCmb();    // 串口号SetBaudCmb();       // 波特率SetDPaityCmb();     // 校验位SetDataBCmb();      // 数据位SetStopBCmb();      // 停止位
}void MainWindow::SetPortNumCmb()
{QStringList commPortList = GetEnableCommPortQt();if(!commPortList.isEmpty()){ui->PortNumCmb->addItems(commPortList);}
}QStringList MainWindow::GetEnableCommPortQt()
{QStringList CommPortList;foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){QSerialPort serial;serial.setPort(info);if (serial.open(QIODevice::ReadWrite)){CommPortList.append(serial.portName());serial.close();}}return CommPortList;
}void MainWindow::SetBaudCmb()
{QStringList baudRList;baudRList.append(tr("110"));baudRList.append(tr("300"));baudRList.append(tr("600"));baudRList.append(tr("1200"));baudRList.append(tr("2400"));baudRList.append(tr("4800"));baudRList.append(tr("9600"));baudRList.append(tr("14400"));baudRList.append(tr("19200"));baudRList.append(tr("38400"));baudRList.append(tr("56000"));baudRList.append(tr("57600"));baudRList.append(tr("115200"));baudRList.append(tr("128000"));baudRList.append(tr("256000"));baudRList.append(tr("自定义"));ui->baudRCmb->addItems(baudRList);ui->baudRCmb->setCurrentIndex(6);
}void MainWindow::SetDPaityCmb()
{QStringList DPaityList;DPaityList.append(tr("NONE"));DPaityList.append(tr("ODD"));DPaityList.append(tr("EVEN"));DPaityList.append(tr("MARK"));DPaityList.append(tr("SPACE"));ui->DPaityCmb->addItems(DPaityList);
}void MainWindow::SetDataBCmb()
{for (int i = 5; i <= 8; i++){QString strDataB = QString::number(i);ui->DataBCmb->addItem(strDataB);}ui->DataBCmb->setCurrentIndex(3);
}void MainWindow::SetStopBCmb()
{ui->StopBCmb->addItem(tr("1"));ui->StopBCmb->addItem(tr("1.5"));ui->StopBCmb->addItem(tr("2"));
}bool MainWindow::SetSerialPortParam(QSerialPort *serial)
{// 设置串口号QString strPortNum = ui->PortNumCmb->currentText();if (strPortNum == tr(""))return false;serial->setPortName(strPortNum);//设置波特率qint32 nBaudRate = ui->baudRCmb->currentText().toInt();serial->setBaudRate(nBaudRate);// 设置奇偶校验int nParityType = ui->DPaityCmb->currentIndex();switch (nParityType){case 0:serial->setParity(QSerialPort::NoParity);break;case 1:serial->setParity(QSerialPort::OddParity);break;case 2:serial->setParity(QSerialPort::EvenParity);break;case 3:serial->setParity(QSerialPort::MarkParity);break;case 4:serial->setParity(QSerialPort::SpaceParity);break;default:serial->setParity(QSerialPort::UnknownParity);break;}// 设置数据位int nDataBits = ui->DataBCmb->currentIndex();switch (nDataBits){case 0:serial->setDataBits(QSerialPort::Data5);break;case 1:serial->setDataBits(QSerialPort::Data6);break;case 2:serial->setDataBits(QSerialPort::Data7);break;case 3:serial->setDataBits(QSerialPort::Data8);break;default:serial->setDataBits(QSerialPort::UnknownDataBits);break;}// 设置停止位int nStopBits = ui->StopBCmb->currentIndex();switch (nStopBits){case 0:serial->setStopBits(QSerialPort::OneStop);break;case 1:serial->setStopBits(QSerialPort::OneAndHalfStop);break;case 2:serial->setStopBits(QSerialPort::TwoStop);break;default:serial->setStopBits(QSerialPort::UnknownStopBits);break;}serial->setFlowControl(QSerialPort::NoFlowControl);return true;
}void MainWindow::closeEvent(QCloseEvent *event)
{if (m_serial->isOpen())m_serial->close();event->accept(); //获取消息
}void MainWindow::timerEvent(QTimerEvent *event)
{if(event->timerId() == Timer){if(1){QByteArray bytes = m_serial->readAll();if ( !bytes.isEmpty() ){QString strRecv = QString::fromLocal8Bit(bytes);for (int i = 0; i < strRecv.length(); i++){if(strRecv[i]== '-'|| strRecv[i] == '+'){int j = i;for (int k = 0; k <17; k++) {getNum[k] = strRecv[j];j++;}break;}}if(rec == 1){ui->lineEditVolt->setText(getNum);QByteArray strBytes =getNum.toUtf8();if(ui->checkBox->isChecked())  //当点击保存的时候保存数据{aFile.write(strBytes,strBytes.length());}}rec = 1;}}}
}void MainWindow::on_btn_start_clicked()
{QString str = ui->lineEditName->text();if(str[0] == '.'){str = "GetNumOfVolt.txt";}aFile.setFileName(str);if (!aFile.open(QIODevice::WriteOnly | QIODevice::Text))return;if(m_serial->isOpen()){m_serial->close();}else{if(!SetSerialPortParam(m_serial)){QMessageBox::critical(this, tr("Error"), tr("串口错误!"), QMessageBox::Ok);return;}//打开串口if(!m_serial->open(QIODevice::ReadWrite)) //打开失败的话{QMessageBox::critical(this, tr("Error"), tr("串口不存在或者被其它程序占用!"), QMessageBox::Ok);return;}m_serial->setReadBufferSize(m_nReadBuffSize);//创建文件ui->btn_start->setEnabled(false);ui->btn_close->setEnabled(true);ui->btn_stop->setEnabled(true);Timer = startTimer(1000);}}void MainWindow::on_btn_stop_clicked()
{killTimer(Timer);if (m_serial->isOpen())m_serial->close();ui->btn_start->setEnabled(true);ui->btn_stop->setEnabled(false);ui->btn_close->setEnabled(true);aFile.close();
}

需要例子的请关注我博客,私信我,看到必回,加油,一起进步吧。

Qt 编程 keySight 34401A 万用表(串口232编程)相关推荐

  1. 树莓派 LabVIEW编程教程,LabVIEW for RaspberryPi,树莓派LINX工具包LabVIEW 树莓派IO编程,LabVIEW 树莓派串口通信编程

    一.树莓派安装LabVIEW环境 LabVIEW2020社区版自带LINX工具包 点击菜单的Tools->MakerHub->LINX->LINX Target Configurat ...

  2. Linux串口应用编程

    目录 Demo 串口应用编程介绍 终端Terminal 串口应用编程(配置.读取.写入) struct termios 结构体配置 输入模式: c_iflag 输出模式: c_oflag 控制模式: ...

  3. LabVIEW编程开发Agilent 34401A(Keysight 34401A)例程与相关资料

    LabVIEW编程开发Agilent 34401A(Keysight 34401A)例程与相关资料 Agilent 34401A (已更名为keysight 34401A)数字万用表,6½ 位.是一款 ...

  4. C#中串口通信编程 收藏

    C#中串口通信编程 收藏 本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名 空间是System.IO.Ports.这个新的框架不但可以访问计算机上的 ...

  5. VC串口通信编程-2

    VC串口通信编程 (2009-07-08 13:48:40) 转载▼ Win32串口编程(转:韩耀旭) 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信 ...

  6. JAVA通信编程(五)——串口通讯的补充说明

    欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 在<JAVA通讯编程(一)--串 ...

  7. Linux下C语言串口应用编程,Linux下串口C语言编程

    Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...

  8. 串口通讯编程一日通1(整合资料) .

    本文以VC++为平台进行串口通信编程 串口通讯在VC++下实现方式有很多,控件自然是最简单话的方式了,但由于控件只支持对话框程序,有些场合又不需要对话框,所以用Windows API实现是比较好的方式 ...

  9. 【嵌入式Linux】嵌入式Linux应用开发基础知识之串口应用编程

    文章目录 前言 1.ARM芯片是如何使用串口发送/接收数据的 2. TTY体系中设备节点的差别 做个小实验 3.TTY驱动程序框架 4.在STM32MP157上做串口实验的准备工作 4.1.使能设备树 ...

最新文章

  1. 能做pc网页吗_梦幻西游网页版:如今还能抽金伙伴吗?玩家亲自验证,感觉还行...
  2. Mobile OpenCart 自适应主题模板 ABC-0074
  3. java中printnb方法_java打印技术---javax.print
  4. HTML5新增标签与属性
  5. 60 Minutes专访李开复:泛人工智能可能永远实现不了
  6. 实例4:python
  7. Spring Boot整合Swagger3配置全局Token
  8. 使用ubuntu钉钉
  9. ip和nmcli命令的的使用方法
  10. 【c++】指针常量与常量指针
  11. nodejs调用google翻译api
  12. MATLAB模糊控制算法,驾驶员制动意图识别,Fuzzy模糊控制算法
  13. mysql里查询中文条件_Mysql对中文查询条件出现的问题
  14. 族谱程序php,族谱系统
  15. 计算机设计媒体专业排名,2020USNEWS媒体与数字媒体专业综合排名
  16. neighbors.kneighbors_graph的原理和应用
  17. NB-IoT、LoRa、sigfox低功耗广域物联网技术,未来的争夺之战
  18. 威联通建立文件服务器的方法,如何管理你的威联通nas文件?这四款神应用让你效率up!up!...
  19. Linux系统运维与架构设计之Linux概述
  20. 朋友间相处的七项法则

热门文章

  1. Centos 默认网关GATEWAY不生效
  2. 宣传和灌输诚信国家理念-乌隆他尼皇家大学
  3. 推荐几个免费的ppt模板网站
  4. anti-fraud-admin  反欺诈后台
  5. Excel教程:Excel中最强大的快捷键你知道吗
  6. python 战舰_战舰python代码学院
  7. 海外权威媒体好评连连,一加5T中国11月28号发布
  8. 华为计算机的隐藏应用程序,华为平板5怎么隐藏软件 荣耀5平板怎么隐藏应用程序?...
  9. 【3小时学会C语言】横向对比/纵向剖析,轻松学习C语言
  10. 凑个热闹 谈谈网红沈大师