QT制作简易串口

2023-05-16

QT 实现一个简易版串口调试助手

文章目录

 1. 设计 UI 界面

 2. 具体代码编写

 3. 最终实现效果图

一、设计 UI 界面

 设计 UI 界面之前,让我们先看一下别人设计的串口助手大概长什么样子,具体有哪些功能。

 我们发现串口调试助手的主要功能就是发现串口,打开串口,接受数据和发送数据。

 至此,我们可以开始具体的 UI 设计了。

  1. 打开 ui 文件(默认情况下为 mainwindow.ui)

  2. 首先 需要发现串口,打开串口,也就是说我们需要 设计 端口,波特率,校验位,数据位,停止位的下拉框 和 一个打开串口的按钮。

  由于串口号,一般来说都是自动检测的,所以我们在这不给出默认值,波特率的话太多了,也不给出默认值。

 检验位的话一般为:NONE,ODD,EVEN,MARK,SPACE

  数据位一般设置为:8,5,6,7(一般情况下使用 8 为数据位,8放在第一个比较好看)

  停止位一般设置为:1,1.5,2(默认为 1)

  大概设计界面如下:



3. 接受数据和发送数据也各自需要一个 文本编辑 类型的框。

    大概设计如下:

注意:每个要使用的 组件需要给它们定义一个 objectName (这样子方便我们后续在代码中用到这个相关组件)

  例如:

二、具体代码编写

首先,我们需要引入 串口 模块

 ​ 在 .pro 文件中第一行 QT += core gui

 ​ 在后面加一个 serialport

QT       += core gui serialport
  1. 首先需要检测串口

  我们需要先引入下方两个QT提供的对串口操作头文件,方便后续对串口进行操作。

#include "QSerialPort"
#include "QSerialPortInfo"

​  右键点击检测串口 ,再点击转到槽,最后点击 clicked() 即可。

 经过上述步骤后,我们就得到了一个 按钮 点击的信号和槽函数。

 OK,我们继续,由于我们只需要获取到 串口号 和 波特率(其实只需要串口号,波特率只是为了偷懒)

  • 先清空串口号
  • 查找串口号,使用 foreach 函数 将 可用的串口信息类 一个一个赋值给 info
  • 将 串口信息类 中的 串口号 一个一个赋值给我们设置的 串口下拉框
  • 波特率的话就比较简单了,只需要将标准波特率返回到一个 list 数组中即可
  • 由于 返回的 波特率 为 qint32( signed int ) 的类型,我们需要将其转化为 QString 类型
void MainWindow::on_testSerial_clicked()
{
    ui->numSerial->clear();				
    //通过QSerialPortInfo查找可用串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) //把后面每个项 依次赋值给 info
    {
        ui->numSerial->addItem(info.portName());
     }
      QList<int> baudList=QSerialPortInfo::standardBaudRates();
      for(int i=0;i<baudList.length();i++){
          char str[20];
          int length;
          int2Chars(str,baudList.at(i),length);
          ui->baudSerial->addItem(QString(QByteArray(str,length )));
      }
      ui->openSerial->setEnabled(true);//使能打开串口
}

//编写一个函数 使得 qint32 转化为 QString ,大概思路为 创建一个临时变量 temp,对 10 求余获取到个位,再加上 '0' 的 ascall码,最后使 a/10 ,进行倒数第二个数值的获取
//最后由于上面是先从个位取值,所以反向 赋值即可
void MainWindow::int2Chars(char str[],long long int a,int &length){
    length=0;
    char temp[20];
    while(a){
        temp[length]='0'+a%10;
        a=a/10;
        length++;
    }
    str[length]=0;
    int i,j;
    i=0;j=length-1;
    for(;i<length;i++,j--){
        str[i]=temp[j];
    }
    return;
}
  1. 打开串口

    • 初始化为 打开串口的 文本名字为 打开串口

    • 判断 按钮文本是否为 打开串口,是的话设置对应的数值,否的话关闭串口,设置打开串口按钮使能 false

    • 点击打开串口,设置 串口号为当前的 文本数值,波特率为 当前的 文本数值再转化为 Int 数值

    • 至于剩下的我们有给出默认值的下拉框,我们可以设置 为下标(currentIndex) 为固定的 串口信息的值。例如第一个 检验位,第一个为 NONE ,我们就设置 串口 检验位 Parity 为QSerialPort::NoParity(需要去查询 qt助手 获取)

void MainWindow::on_openSerial_clicked()
{
    if(ui->openSerial->text() == QString("打开串口"))//判断是否是打开串口
    {
        serial.setPortName(ui->numSerial->currentText());
        serial.setBaudRate(ui->baudSerial->currentText().toInt());

        switch (ui->checkSerial->currentIndex()) {

            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:
                break;
        }

        switch (ui->dataSerial->currentText().toInt()) {
            case 5:
                serial.setDataBits(QSerialPort::Data5);
            break;
            case 6:
                serial.setDataBits(QSerialPort::Data6);
            break;
            case 7:
                serial.setDataBits(QSerialPort::Data7);
            break;
            case 8:
                serial.setDataBits(QSerialPort::Data8);
            break;

        default:
            break;
        }

        switch (ui->dataSerial->currentIndex()) {
            case 0:
                serial.setStopBits(QSerialPort::OneStop);
            break;
            case 1:
                serial.setStopBits(QSerialPort::OneAndHalfStop);
            break;
            case 2:
                serial.setStopBits(QSerialPort::TwoStop);
            break;

        default:
            break;
        }

        if(serial.open(QIODevice::ReadWrite))
        {
            QMessageBox::about(NULL, "提示", "打开串口成功");
            ui->openSerial->setText("关闭串口");
            ui->openLight->setEnabled(true);
            ui->closeLight->setEnabled(true);

            ui->testSerial->setEnabled(false);

            ui->numSerial->setEnabled(false);
            ui->checkSerial->setEnabled(false);
            ui->baudSerial->setEnabled(false);
            ui->dataSerial->setEnabled(false);
            ui->stopSerial->setEnabled(false);

        }else{
            QMessageBox::about(NULL, "提示", "打开串口失败");
        }
    }else{
        serial.close();
        ui->openLight->setEnabled(false);
        ui->closeLight->setEnabled(false);
        ui->openSerial->setText("打开串口");
        ui->openSerial->setEnabled(false);
        ui->testSerial->setEnabled(true);

        ui->numSerial->setEnabled(true);
        ui->checkSerial->setEnabled(true);
        ui->baudSerial->setEnabled(true);
        ui->dataSerial->setEnabled(true);
        ui->stopSerial->setEnabled(true);
    }
}
  1. 发送和接受数据

    3.1 接受数据

    由于QT显示为 UTF8 ,windows显示为 GBK,需要切换

    void MainWindow::on_readSerial()
    {
        QByteArray buffer = serial.readAll();//串口接受数据
        QString Buf = QString::fromLocal8Bit(buffer);//设置成 可以从中文GBK 变成 utf8
        ui->recvTextEdit->clear();// 清空显示
        ui->recvTextEdit->setText(Buf);//显示
    }
    

    3.2 发送数据

    void MainWindow::on_sendButton_clicked()
    {
    	//获取数据,更改为 local8Bit 可以显示中文
        QByteArray data = ui->sendTextEdit->toPlainText().toLocal8Bit();
        serial.write(data);
    
    }
    
    

最终实现效果图

最后

​ 我们这个简易的串口调试助手就做好了。若有什么问题,可以评论区评论,一起讨论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT制作简易串口 的相关文章

  • 各种seq ribo-seq rna-seq pipelines

    SPR WorkFlow Collection sysPipe
  • tinyarray 相关性cor.full

    R Documentation cor test for one variable with all variables Description cor test for all variables each two columns Usa
  • Elasticsearch中FST与前缀搜索

    FST的基本概念 FST xff08 Finite State Transducer xff09 是一种有限状态自动机 xff0c 可以将一组输入符号映射为一组输出符号 FST由一组状态和一组转移组成 xff0c 状态可以是起始状态 接受状
  • zabbix邮箱告警的三种方式

    zabbix邮箱告警的三种方式 1 在web界面配置邮箱告警2 在本地邮箱配置邮箱告警 43 脚本3 在第三方邮箱配置邮箱告警 43 脚本 1 在web界面配置邮箱告警 添加媒介 我们以126邮箱为示例 先打开POP3 SMTP服务 xff
  • NanoStringQCPro: Quality metrics and data processing methods for NanoString mRNA gene expression dat

    addCodesetAnnotationAdd NanoString codeset annotation to an RccSetaddQCFlagsAdd sample QC flags to an rccSetallSumPlotal
  • Python爬虫编程7——多线程爬虫

    目录 一 多线程基本介绍 程序中模拟多任务 二 多线程的创建 三 主线程与子线程的执行关系 四 查看线程数量 五 线程间的通信 xff08 多线程共享全局变量 xff09 六 线程间的资源竞争 互斥锁和死锁 互斥锁 死锁 七 Queue线程
  • SCL 和 SDA 是 I2C 总线上的两个信号线。 c++ 模拟数据

    I2C xff08 Inter Integrated Circuit xff0c 又称为 IIC 或 TWI xff09 是一种串行通信协议 xff0c 用于在微控制器和外围设备之间进行数据传输 I2C 协议只需要两根信号线 xff1a S
  • Python 代码中三种波浪线和 PEP8

    红色 红色波浪线是代码的错误 必须处理 代码才能执行 注意 在后续课程中 某些代码没有写完 也会出现红色波浪线 灰色 灰色波浪线 xff0c 不会影响代码的正常执行 xff0c 基本上所有的灰色 浪线都是PEP8 造成的PEP8 是Pyth
  • 阶乘累加求和

    项目场景 xff1a 入门练习题 问题描述 xff1a 提示 xff1a 这里描述项目中遇到的问题 xff1a 请用函数编程实现 求和 1 43 2 43 3 xff01 43 n xff
  • python爬虫之数据解析(BeautifulSoup)

    BeautifulSoup也是python爬虫常用的一种数据解析方法 xff0c 主要就两步 1 实例化一个Beautifulsoup对象 xff0c 平且将页面源码数据加载到该对象中 2 通过调用Beautifulsoup对象中相关的属性
  • 解决Ubuntu不能上网以及无法远程连接Ubuntu

    本文环境 物理机OS xff1a Windows10 专业版 虚拟机平台 xff1a VMware Workstation 16 Pro 虚拟机OS xff1a Ubuntu 20 04 相信大家在使用Ubuntu中也有遇到不能上网 xff
  • Python实现地方天气查询并语音播报。

    续上次篇程序 xff0c 有老哥说做个续集 xff0c 那我就做个续集和优化 xff0c 升级 上篇文章 xff1a Python获取城市天气 详细介绍用api获取城市的天气赶快收藏起来 xff01 Pymili的博客 CSDN博客 pyt
  • JAVA 实参和形参

    形参 xff1a 是指在定义函数 时使用的参数 xff0c 目的是用于接收调用该函数时传入的参数 简单理解 xff0c 就是所有函数 xff08 即方法 xff09 的参数都是形参 实参 xff1a 在调用有参函数时 xff0c 主调函数和
  • JAVA 包装类

    1 概念 Java是一个面向对象的编程语言 xff0c 但是Java中的八种基本数据类型却是不面向对象的 xff0c 为了使用方便和解决这个不足 xff0c 在设计类时为每个基本数据类型设计了一个对应的类进行代表 xff0c 这样八种基本数
  • swagger被拦截器拦截

    配置swagger文档 xff0c 被拦截器拦截不能使用 拦截器中添加以下配置 xff0c 适当修改即可使用 重写addInterceptors registry addInterceptor new UserInterceptor add
  • JAVA之JDBC连接数据库

    前景说明 xff1a 在我们刚开始使用数据库的时候 xff0c 发现只能在mysql编辑器里面使用sql语句来完成对数据库的操作 xff0c 那我们怎么来通过Java来操控数据库呢 xff1f 这个时候就有了JDBC的出现 1 什么是JDB
  • Css margin 和 float浮动

    1 浮动 定义 浮动是css里面布局最多的一个属性 xff0c 也是很重要的一个属性 float xff1a 表示浮动的意思 它有四个值 none 表示不浮动 xff0c 默认right xff1a 表示右浮动left 表示左浮动 floa
  • Java Servlet组件

    1 什么是Servlet xff1f 从广义上来讲 xff0c Servlet规范是Sun公司制定的一套技术标准 xff0c 包含与Web应用相关的一系列接口 xff0c 是Web应用实现方式的宏观解决方案 而具体的Servlet容器负责提
  • JAVA 之 Ajax

    1 什么是Ajax xff1f AJAX xff08 Asynchronous Javascript And XML xff09 翻译成中文就是 异步Javascript和XML 即是用Javascript语言与服务器进行异步交互 xff0
  • Servlet 的Request和Response

    1 Request和Response概述 1 Request 获取请求数据 浏览器会发送HTTP请求到后台服务器 Tomcat HTTP的请求中会包含很多请求数据 请求行 43 请求头 43 请求体 后台服务器 Tomcat 会对HTTP请

随机推荐

  • 链接标签的使用

    什么是链接 xff1f 链接相当于是一个传送门 xff0c 点击链接就可以从该页面 xff0c 跳转到其他页面 xff0c 或者从该页面跳转到该页面的其他地方 链接的表现形式有哪些 xff1f 链接可以 表现为文字 xff0c 图片 xff
  • 报错 java: 程序包org.apache.ibatis.annotations不存在

    今天在使用mybatis运行项目时 xff0c 项目忽然报错了 xff0c 检查了自己的pom xml文件也没有问题 xff0c 报错情况如图 xff1a 在网上找了一大堆方法 xff0c 都没有解决问题 xff0c 这里附上一个网上的常用
  • spring框架

    文章内容 介绍spring框架 为什么要使用spring框架 如何使用spring IOC控制反转 1 介绍spring框架 1 spring是一个轻量级开源的JAVAEE框架 2 Spring提高了IOC和AOP IOC 控制反转 把创建
  • Ubuntu忘记密码怎么办 如何重置Ubuntu登入密码

    1 首先重新启动Ubuntu系统 xff0c 然后快速按下shift键 xff0c 以调出grub启动菜单 2 在这里我们选择第二个 xff08 Ubuntu高级选项 xff09 xff0c 选中后按下Enter键 3 选择第二个recov
  • 快速掌握e语言,以js语言对比,快速了解掌握。

    易语言 xff0c 怎么调试输出 xff0c 查看内容 在js语言里 xff0c 弹窗是 alert 在易语言里 xff0c 弹窗是 信息框 弹出显示内容 0 标题 在js语言里 xff0c 调试输出是 console log 在易语言里
  • java 实现Comparable接口排序,升序、降序、倒叙

    本人由于项目开发中需要对查询结果list进行排序 xff0c 这里根据的是每一个对象中的创建时间降序排序 本人讲解不深 xff0c 只实现目的 xff0c 如需理解原理还需查阅更深的资料 1 实现的效果 2 创建排序的对象 package
  • gitbash不能粘贴

    点击鼠标滚轮或者shift 43 ins
  • Hive安装与配置常见问题解决

    欢 43 迎使用Markdown编辑器 提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 目录 前言一 Hive是什么 xff1f 二 安装步骤1 引入jar包2 配置步骤1 hive s
  • 【Linux】生产者消费者模型

    文章目录 1 生产者消费者模型1 1生产者消费者模型的特点1 2生产者消费者模型的原则1 3生产者消费者模型的优点 2 基于阻塞队列的生产者消费者模型2 1如何理解生产者消费者模型的并发 xff1f 3 信号量3 1信号量接口3 2基于环形
  • Ubuntu设置允许root用户登录

    Ubuntu激活root用户 sudo passwd root 设置root密码 设置允许root通过ssh默认登录 vim etc ssh sshd config root权限编辑 PermitRootLogin yes 在第一行添加内容
  • python编写程序统计一元人民币换成一分、两分和五分的所有兑换方案个数(用while循环)

    a 61 int input 34 输入钱数 xff08 单位 xff1a 元 xff09 34 e 61 a 100 count 61 0 i 61 1 while i lt e 5 43 1 i 43 61 1 b 61 e 5 i 2
  • springboot简易整合mybatis

    SpringBoot整合Mybatis篇 实现单表mybatis整合 准备sql 创建数据库 create database if not exists 96 mybatis 96 修改数据库默认字节编码 alter database 96
  • Springboot+PageHelper实现分页(前后端简单展示)

    Springboot 43 PageHelper实现分页 前后端简单展示 创建表及赋值 创建表 DROP TABLE IF EXISTS 96 page learn 96 CREATE TABLE 96 page learn 96 96 i
  • SpringBoot缓存注解使用(无数据库操作)

    SpringBoot缓存注解使用 无数据库操作 缓存注解介绍 64 EnableCaching注解 xff1a 开启注解缓存的支持 64 Cacheable注解 xff1a 对方法的查询结果进行缓存 64 CachePut注解 xff1a
  • JavaScript(基于Java开发的学习)

    JavaScript 基于Java基础学习 JavaScript结构图 1 JS简介 JavaScript xff08 行为 xff09 xff1a 是一种弱类型脚本语言 xff0c 其源码不需经过编译 xff0c 而是由浏览器解释运行 x
  • MyBatis框架

    MyBatis学习结构 1 MyBatis框架简介 MyBatis是一款优秀的持久层框架 它支持定制化SQL 存储过程以及高级映射 MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集 MyBatis可以使用简单的XML或
  • springboot+vue实现增删改查小demo

    学习vue xff0c 就想着自己搭建一个框架学习一下 xff0c 本文属于vue与后台的增删改查入门demo xff0c 不做讲解 xff0c 只为了记录一下代码 后台框架前台框架的搭建自己百度就可以做到了 项目的源码地址 https g
  • JWT(Json web token)

    1 什么是JWT 官网地址 JSON Web Token Introduction jwt io 翻译 jsonwebtoken xff08 JWT xff09 是一个开放标准 xff08 rfc7519 xff09 xff0c 它定义了一
  • MyBatis-plus

    MyBatis plus学习结构图 1 MyBatis plus简介 为什么要学习它呢 MyBatisPlus可以节省我们大量工作时间 xff0c 所有的CRUD代码它都可以自动化完成 JPA tk mapper MyBatisPlus 偷
  • QT制作简易串口

    QT 实现一个简易版串口调试助手 文章目录 1 设计 UI 界面 2 具体代码编写 3 最终实现效果图 一 设计 UI 界面 设计 UI 界面之前 xff0c 让我们先看一下别人设计的串口助手大概长什么样子 xff0c 具体有哪些功能 我们