Qt 编程 keySight 34401A 万用表(串口232编程)
最近编写一个读取 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编程)相关推荐
- 树莓派 LabVIEW编程教程,LabVIEW for RaspberryPi,树莓派LINX工具包LabVIEW 树莓派IO编程,LabVIEW 树莓派串口通信编程
一.树莓派安装LabVIEW环境 LabVIEW2020社区版自带LINX工具包 点击菜单的Tools->MakerHub->LINX->LINX Target Configurat ...
- Linux串口应用编程
目录 Demo 串口应用编程介绍 终端Terminal 串口应用编程(配置.读取.写入) struct termios 结构体配置 输入模式: c_iflag 输出模式: c_oflag 控制模式: ...
- LabVIEW编程开发Agilent 34401A(Keysight 34401A)例程与相关资料
LabVIEW编程开发Agilent 34401A(Keysight 34401A)例程与相关资料 Agilent 34401A (已更名为keysight 34401A)数字万用表,6½ 位.是一款 ...
- C#中串口通信编程 收藏
C#中串口通信编程 收藏 本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名 空间是System.IO.Ports.这个新的框架不但可以访问计算机上的 ...
- VC串口通信编程-2
VC串口通信编程 (2009-07-08 13:48:40) 转载▼ Win32串口编程(转:韩耀旭) 在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信.串口通信 ...
- JAVA通信编程(五)——串口通讯的补充说明
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 在<JAVA通讯编程(一)--串 ...
- Linux下C语言串口应用编程,Linux下串口C语言编程
Linux下串口C语言编程 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.9 积分 串口操作代码#include #include #inclu ...
- 串口通讯编程一日通1(整合资料) .
本文以VC++为平台进行串口通信编程 串口通讯在VC++下实现方式有很多,控件自然是最简单话的方式了,但由于控件只支持对话框程序,有些场合又不需要对话框,所以用Windows API实现是比较好的方式 ...
- 【嵌入式Linux】嵌入式Linux应用开发基础知识之串口应用编程
文章目录 前言 1.ARM芯片是如何使用串口发送/接收数据的 2. TTY体系中设备节点的差别 做个小实验 3.TTY驱动程序框架 4.在STM32MP157上做串口实验的准备工作 4.1.使能设备树 ...
最新文章
- 能做pc网页吗_梦幻西游网页版:如今还能抽金伙伴吗?玩家亲自验证,感觉还行...
- Mobile OpenCart 自适应主题模板 ABC-0074
- java中printnb方法_java打印技术---javax.print
- HTML5新增标签与属性
- 60 Minutes专访李开复:泛人工智能可能永远实现不了
- 实例4:python
- Spring Boot整合Swagger3配置全局Token
- 使用ubuntu钉钉
- ip和nmcli命令的的使用方法
- 【c++】指针常量与常量指针
- nodejs调用google翻译api
- MATLAB模糊控制算法,驾驶员制动意图识别,Fuzzy模糊控制算法
- mysql里查询中文条件_Mysql对中文查询条件出现的问题
- 族谱程序php,族谱系统
- 计算机设计媒体专业排名,2020USNEWS媒体与数字媒体专业综合排名
- neighbors.kneighbors_graph的原理和应用
- NB-IoT、LoRa、sigfox低功耗广域物联网技术,未来的争夺之战
- 威联通建立文件服务器的方法,如何管理你的威联通nas文件?这四款神应用让你效率up!up!...
- Linux系统运维与架构设计之Linux概述
- 朋友间相处的七项法则