QT---制作简易串口助手

news2024/11/24 12:39:46

一、ui制作

    • 打开QTCreator创建一个新文件

2.进入UI设计界面进行设计

进入ui界面后,选择相应的控件将串口助手的样子给做出来,我选择的是如下的控件做这个串口助手:

1.按钮:

2.下拉列表

3.标签

4.组合框

5.文本编辑

绘制ui界面如下:

值得注意的是:我们使用Plain Text Edit 作为串口数据的接收区的时候是不能进行编辑的,所以要将Plain Text Edit 的属性改成只读:

在对端口和波特率等信息的布局时,不要采用水平布局和垂直布局而是用栅格布局,否则下拉列表框的排列会乱掉:

在进行编程之前,我们将控件的名字修改一下,方便后面编程:

二、编程实现功能

  1. 在.pro文件中添加如下内容:

QT       += serialport
  1. 在W.h文件中添加串口要使用的头文件

#include <QSerialPort>
  1. 在W.h文件中添加一个QSerialPort* serialPort 的类成员,并在W.cpp中进行实例化:

//实例化一个串口对象
serialPort = new QSerialPort;
  1. 接下来就是完善各个模块的功能

(1)将当前可用串口,添加到下拉列表

    //搜索系统当前可用串口
    QStringList serialPortName;
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){
        serialPortName << info.portName();
    }
    //将搜索到的串口添加到下拉列表中
    ui->portCb->addItems(serialPortName);
注意:添加头文件:#include <QSerialPortInfo>

(2)分别给按钮添加槽函数:

  • 打开或关闭的的槽函数:

void Widget::on_openOrCloseBt_clicked()
{
    QSerialPort::BaudRate baudRate;
    QSerialPort::DataBits daraBits;
    QSerialPort::Parity   parity;
    QSerialPort::StopBits stopBits;

    //设置串口名称
    serialPort->setPortName(ui->portCb->currentText());

    //设置波特率
    switch (ui->baudRateCb->currentIndex()) {

        case 0:
            baudRate = QSerialPort::Baud4800;
            break;
        case 1:
            baudRate = QSerialPort::Baud9600;
            break;
        case 2:
            baudRate = QSerialPort::Baud115200;
            break;
    }
    serialPort->setBaudRate(baudRate);

    //设置数据位
    switch (ui->dataBitsCb->currentIndex()) {

        case 0:
            daraBits = QSerialPort::Data5;
            break;
        case 1:
            daraBits = QSerialPort::Data6;
            break;
        case 2:
            daraBits = QSerialPort::Data7;
            break;
        case 3:
            daraBits = QSerialPort::Data7;
            break;
    }
    serialPort->setDataBits(daraBits);

    //设置校验位
    switch (ui->portCb->currentIndex()) {

        case 0:
            parity = QSerialPort::NoParity;
            break;
        case 1:
            parity = QSerialPort::OddParity;
            break;
        case 2:
            parity = QSerialPort::EvenParity;
            break;
        case 3:
            parity = QSerialPort::MarkParity;
            break;
        case 4:
            parity = QSerialPort::SpaceParity;
            break;
    }
    serialPort->setParity(parity);

    //设置停止位
    switch (ui->portCb->currentIndex()) {

        case 0:
            stopBits = QSerialPort::OneStop;
            break;
        case 1:
            stopBits = QSerialPort::OneAndHalfStop;
            break;
        case 2:
            stopBits = QSerialPort::TwoStop;
            break;
    }
    serialPort->setStopBits(stopBits);

    //打开或关闭串口
    if(ui->openOrCloseBt->text() == "打开"){
        //打开串口
        if(serialPort->open(QIODevice::ReadWrite) == true){
            ui->openOrCloseBt->setText("关闭");
        }else{
            QMessageBox::critical(this,"error","Open Failed");
        }
    }else if(ui->openOrCloseBt->text() == "关闭"){
        //关闭串口
        serialPort->close();
        ui->openOrCloseBt->setText("打开");
    }
}
  • 清空接收区槽函数

void Widget::on_clearRecvBt_clicked()
{
    //清空接收区
    ui->recvEdit->clear();
}
  • 清空发送区槽函数

void Widget::on_clearSendBt_clicked()
{
    //清空发送区
    ui->sendEdit->clear();
}
  • 发送槽函数

void Widget::on_sendBt_clicked()
{
    //获取sendEdit编辑器的文本内容
    //qDebug(buf);
    //发送写入数据
    serialPort->write(ui->sendEdit->toPlainText().toLocal8Bit().data());
}

(3)读取数据

当我们串口有数据到来的时候,会触发一个readyRead的信号,这时我们需要自定义一个槽函数来从串口中接收数据:

  1. 在W.cpp文件的构造函数中将信号与自定义槽函数绑定起来

//当串口有数据到来时,serialPort发送ReadyRead信号,执行serialReadSlot槽函数
connect(serialPort,SIGNAL(readyRead()),this,SLOT(serialReadSlot()));
  1. 自定义槽函数定义:

void Widget::serialReadSlot()
{
    //获取数据
    QString buf;
    buf = QString(serialPort->readAll());
    //将获取的数据追加在文本编辑的末尾
    ui->recvEdit->appendPlainText(buf);
}

注意:在使用自定义的槽函数时,需要在W.h类的private slots:哪里声明一下槽函数:

这样串口助手的基本功能就完成了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/193310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何用Windows自带命令修改文件和图片的MD5

首先说下&#xff0c;md5到底是啥&#xff0c;它是一段固定长度的数据。无论原始数据是多长或多短&#xff0c;其MD5值都是128bit。另外md5是确定性&#xff0c;一个原始数据的MD5值是唯一的&#xff0c;同一个原始数据不可能会计算出多个不同的MD5值&#xff1b;类似人类的身份…

快速搭建前后端分离项目

后端 配置文件和依赖 创建一个SpringBoot项目&#xff0c;采用Mybatis-Plus快速构建项目。 application.yml进行配置 server:port: 80spring:datasource:username: rootpassword: 123456url: jdbc:mysql://localhost:3306/ems?useSSLfalse&useUnicodetrue&charact…

C++——哈希

目录 unordered系列关联式容器 unordered_mapunordered_map在线文档说明 unordered_map的接口说明 unordered系列优势 哈希 解决哈希冲突 1.闭散列——开放定址法 思考&#xff1a;哈希表什么情况下进行扩容&#xff1f;如何扩容&#xff1f; 插入元素代码 查找元素 …

Linux操作系统--用户和群组(保姆级教程)

用户和群组 用户 什么是用户&#xff0c;即登录到linux操作系统的账号就是用户。在linux操作系统中账户的类别主要有三类&#xff1a;1、超级管理员&#xff08;root&#xff09;,在linux中超级管理员的账户是root&#xff0c;这个root账户就类似于windows操作系统中administr…

pom.xml配置中引入Oracle依赖

pom.xml配置中引入Oracle依赖1. Download Driver1.1 pom.xml2.Awakening1. Download Driver 因为Oracle是要收费的&#xff0c;所以不能通过远程的方式来引入&#xff0c;可以通过mvn指令导入到Maven本地仓库。 下载地址 Oracle Website: https://www.oracle.com/database/tech…

MyBatis案例 | 使用映射配置文件实现CRUD操作——查询所有数据

本专栏主要是记录学习完JavaSE后学习JavaWeb部分的一些知识点总结以及遇到的一些问题等&#xff0c;如果刚开始学习Java的小伙伴可以点击下方连接查看专栏 本专栏地址&#xff1a;&#x1f525;JavaWeb Java入门篇&#xff1a; &#x1f525;Java基础学习篇 Java进阶学习篇&…

各类SDR的USB接口一致性测试

最近用高带宽示波器测了好几个SDR产品的USB2接口一致性。由于探头数量只有1个&#xff0c;所以不能测全所有的项目。但已经包含了最主要的USB眼图&#xff08;信号质量&#xff09;项目。 待测件包含&#xff1a; 1.原版RTL-SDR 2.自制RTL-SDR 3.HackRF 4.无线电罗盘v0.8 测试…

css实现超出div长度文字自动隐藏或用省略号表示

网页中一些区域的标题文字是不能换行的&#xff0c;例如首页显示的文章标题&#xff0c;因为布局是固定的&#xff0c;换行会打乱布局&#xff0c;从而使网页产生错位。因此&#xff0c;我们需要一行一段文字&#xff0c;超出行宽的文字用省略号表示或者直接去掉不用省略号代替…

在CentOS-6.9配置apache服务(1)---基于个人主页的身份验证

文章目录一 系统环境二 用户身份验证2.1 编写主配置文件2.2 编写用户身份验证的配置文件2.3 创建用户密码文件2.4 创建测试页面2.5 测试三 基于个人主页的身份验证3.1 修改主配置文件3.2 创建测试用户3.3 创建测试的个人主页3.4 设置防火墙和selinux3.5 测试在部署了apache服务…

LeetCode-189. 轮转数组

目录方法一&#xff1a;使用额外的数组方法二&#xff1a;环状替换方法三&#xff1a;数组翻转题目来源 189. 轮转数组 方法一&#xff1a;使用额外的数组 我们可以使用额外的数组来将每个元素放至正确的位置。用 n 表示数组的长度&#xff0c;我们遍历原数组&#xff0c;将原…

JSP SSM校园超市管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 JSPssm 校园超市管理系统 是一套完善的系统源码&#xff0c;对理解JSP java SrpingMVC mybiats 框架 MVC编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;以及相应配套的设计文档 &#xff0c;系统主要采用B/S模式开发。 研究的基…

Dubbo 中 Zookeeper 注册中心原理分析

本文通过分析Dubbo中ZooKeeper注册中心的实现ZooKeeperResitry的继承体系结构&#xff0c;自顶向下分析了AbstractRegistry&#xff08;提供了服务数据的本地缓存&#xff09;、FailbackRegistry&#xff08;服务注册订阅相关的异常重试&#xff09;、CacheableFailbackRegistr…

Web Spider Fiddler - JS Hook 基本使用

文章目录前言一、资源下载二、什么是Hook三、Hook 的几种方式四、Fiddler - 编程猫插件安装五、Fiddler - Hook 案例六、常用的js hook代码Hook CookieHook Header总结前言 Hook技术也叫钩子函数&#xff0c;功能是把网站的代码拉出来&#xff0c;改成我们自己想执行的代码片段…

mysql:性能分析工具

检查是否开启慢查询日志&#xff0c;查看慢查询的日志中的数据 也可以通过查看sql执行成本&#xff0c;进行优化 统计SQL的查询成本&#xff1a;last_query_cost SHOW STATUS LIKE ‘last_query_cost’; 查询优化器的成本&#xff0c;查看最后一个sql使用的多少数据页 定位执…

1-2MySQL 面试题

MySQL 面试题 1.说一下 MySQL 执行一条查询语句的内部执行过程&#xff1f; 答&#xff1a;MySQL 执行一条查询的流程如下&#xff1a; 客户端先通过连接器连接到 MySQL 服务器&#xff1b;连接器权限验证通过之后&#xff0c;先查询是否有查询缓存&#xff0c;如果有缓存&a…

大型React项目需要使用ES6解决方案以及对JSX的使用【React高级技术】

不使用 ES6 然而&#xff0c;在纯浏览器端使用ES6语法时&#xff0c;浏览器支持存在差异&#xff0c;这需要特殊处理才能正常运行。 支持ES2015桌面浏览器 Chrome&#xff1a;从51版开始&#xff0c;它可以支持ES6 97%的新功能。 Firefox&#xff1a;53版本支持97%的ES6新功能…

几个超级牛的在线 Python 解释器

安装 Python 很容易&#xff0c;但或许你正在用智能手机/平板电脑&#xff0c;在用不允许安装软件的电脑&#xff0c;或者因为其它原因无法安装 Python。那么&#xff0c;如何通过免安装的方式使用 Python 呢&#xff1f; 本文将介绍 18 个免费的 Python 解释器和交互式 Shell…

软测 · 软件测试的基本概念 · 什么是需求 · 测试用例的概念 · 软件错误(bug)的概念

一、什么是软件测试软件测试和开发的区别测试和调试的区别一个优秀的软件测试人员具备的素质二、什么是需求从测试人员角度看待需求三、测试用例的概念四、软件错误&#xff08;bug&#xff09;的概念一、什么是软件测试 最常见的解释是&#xff1a;软件测试就是找 BUG&#x…

Linux学习之常用基本命令【3】

文章目录一 账号管理1.1 用户账号概述1.2 用户账号管理1.2.1 useradduseradduseradd添加账号1.2.2 userdeluserdeluserdel删除帐号1.2.3 usermodusermodusermod修改账号1.3 用户口令管理二 用户组管理2.1 用户组概述2.1.1 groupaddgroupaddgroupadd添加用户组2.1.2 groupdelgro…

渲染管线

Unity 是一款跨平台的 3D 引擎&#xff0c;有着强大的渲染功能&#xff0c;并主要用于游戏开发。谈到 Unity 的渲染功能&#xff0c;我们不得不提及到着色器&#xff08;Shader&#xff09;——3D 游戏引擎中最重要的一个因素,它在游戏效果以及画面显示方面起到了决定性的作用。…