【QT5】<知识点> QT串口编程

news2024/12/28 3:57:56

目录

前言

一、串口编程步骤

0. 添加串口模块

1. 自动搜索已连接的串口

2. 创建串口对象

3. 初始化串口

4. 打开串口

5. 关闭串口

6. 发送数据

7. 接收数据

二、简易串口助手

1. 实现效果

2. 程序源码

3. 实现效果二


前言

本篇记录QT串口编程相关内容,并制作一个串口助手来巩固理论知识。


一、串口编程步骤

0. 添加串口模块

pro文件中QT += serialport

1. 自动搜索已连接的串口

假设我们已经在ui设计器里添加了一个QComboBox的对象cbSerialPort。接下来,我们通过以下代码将所有已连接的串口名称加入cbSerialPort中,方便用户选择。

//QSerialPortInfo::availablePorts()能够自动搜索已连接的串口
//需要添加头文件<QSerialPortInfo>
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
   ui->cbSerialPort->addItem(info.portName());
}

2. 创建串口对象

//需要添加头文件<QSerialPort>
QSerialPort * serialport = new QSerialPort(this);

3. 初始化串口

【1】初始化串口名:

serialPort->setPortName(ui->cbSerialPort->currentText());

【2】初始化波特率:

QSerialPort::BaudRate baudRate;
if (ui->cbBaudRate->currentText() == "4800") {
    baudRate = QSerialPort::Baud4800;
} else if (ui->cbBaudRate->currentText() == "9600") {
    baudRate = QSerialPort::Baud9600;
} else if (ui->cbBaudRate->currentText() == "115200") {
    baudRate = QSerialPort::Baud115200;
}
serialPort->setBaudRate(baudRate);

【3】初始化数据位:

QSerialPort::DataBits dataBits;
if (ui->cbDataBit->currentText() == "5") {
    dataBits = QSerialPort::Data5;
} else if (ui->cbDataBit->currentText() == "6") {
    dataBits = QSerialPort::Data6;
} else if (ui->cbDataBit->currentText() == "7") {
    dataBits = QSerialPort::Data7;
} else if (ui->cbDataBit->currentText() == "8") {
    dataBits = QSerialPort::Data8;
}
serialPort->setDataBits(dataBits);

【4】初始化停止位:

QSerialPort::StopBits stopBits;
if (ui->cbStopBit->currentText() == "1") {
    stopBits = QSerialPort::OneStop;
} else if (ui->cbStopBit->currentText() == "1.5") {
    stopBits = QSerialPort::OneAndHalfStop;
} else if (ui->cbStopBit->currentText() == "2") {
    stopBits = QSerialPort::TwoStop;
}
serialPort->setStopBits(stopBits);

【5】初始化校验位:

QSerialPort::Parity parity;
if (ui->cbCheckBit->currentText() == "none") {
    parity = QSerialPort::NoParity;
}
serialPort->setParity(parity);

4. 打开串口

//弹出一个窗口告知用户初始化结果
if (serialPort->open(QIODevice::ReadWrite)) {
    QMessageBox::information(this, "提示", "成功");
} else {
    QMessageBox::critical(this, "提示", "失败");
}

5. 关闭串口

serialPort->close();

6. 发送数据

serialPort->write(ui->sendEdit->text().toUtf8());

7. 接收数据

【1】建立信号槽,当有数据发送过来时,调用自定义的槽函数receiveMessage()

connect(serialPort, SIGNAL(readyRead()), this, SLOT(receiveMessage()));

【2】实现槽函数receiveMessage()

void Widget::receiveMessage()
{
    QString buf = serialPort->readAll();
    ui->recvEdit->appendPlainText(buf);
}

二、简易串口助手

1. 实现效果

此QT程序在Windows环境下编译运行,且连接IMX6ULL开发板(串口号为12)。IMX6ULL开发板收到信息后会自动发回接收到的信息。因此,本程序的实现效果如下图所示:

2. 程序源码

【1】widget.h:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QSerialPort>
#include <QSerialPortInfo>

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    void on_btnOpenSerial_clicked();

    void on_btnCloseSerial_clicked();

    void receiveMessage();

    void on_btnSendMesg_clicked();

    void on_btnClearRecv_clicked();

    void on_btnClearSend_clicked();

private:
    Ui::Widget *ui;
    QSerialPort *serialPort;
};
#endif // WIDGET_H

【2】widget.cpp:

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>

/***********************************************************
  * @函数: Widget
  * @功能: 构造函数
  * @参数: parent---父对象
  * @返回: 无
  *********************************************************/
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //搜索连接的串口,将名称加入cbSerialPort中
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        ui->cbSerialPort->addItem(info.portName());
    }
    //创建串口对象
    serialPort = new QSerialPort(this);
    //信号槽:串口接收数据
    connect(serialPort, SIGNAL(readyRead()), this, SLOT(receiveMessage()));
    //设置"打开串口"与"关闭串口"按钮互斥
    ui->btnOpenSerial->setEnabled(true);
    ui->btnCloseSerial->setEnabled(false);
}


/***********************************************************
  * @函数: ~Widget
  * @功能: 析构函数
  * @参数: 无
  * @返回: 无
  *********************************************************/
Widget::~Widget()
{
    delete ui;
}


/***********************************************************
  * @函数: on_btnOpenSerial_clicked
  * @功能: “打开串口”按钮的槽函数,初始化串口
  * @参数: 无
  * @返回: 无
  *********************************************************/
void Widget::on_btnOpenSerial_clicked()
{
    //初始化串口名
    serialPort->setPortName(ui->cbSerialPort->currentText());
    //初始化波特率
    QSerialPort::BaudRate baudRate;
    if (ui->cbBaudRate->currentText() == "4800") {
        baudRate = QSerialPort::Baud4800;
    } else if (ui->cbBaudRate->currentText() == "9600") {
        baudRate = QSerialPort::Baud9600;
    } else {
        baudRate = QSerialPort::Baud115200;
    }
    serialPort->setBaudRate(baudRate);
    //初始化数据位
    QSerialPort::DataBits dataBits;
    if (ui->cbDataBit->currentText() == "5") {
        dataBits = QSerialPort::Data5;
    } else if (ui->cbDataBit->currentText() == "6") {
        dataBits = QSerialPort::Data6;
    } else if (ui->cbDataBit->currentText() == "7") {
        dataBits = QSerialPort::Data7;
    } else {
        dataBits = QSerialPort::Data8;
    }
    serialPort->setDataBits(dataBits);
    //初始化停止位
    QSerialPort::StopBits stopBits;
    if (ui->cbStopBit->currentText() == "1") {
        stopBits = QSerialPort::OneStop;
    } else if (ui->cbStopBit->currentText() == "1.5") {
        stopBits = QSerialPort::OneAndHalfStop;
    } else {
        stopBits = QSerialPort::TwoStop;
    }
    serialPort->setStopBits(stopBits);
    //初始化校验位
    QSerialPort::Parity parity;
    if (ui->cbCheckBit->currentText() == "none") {
        parity = QSerialPort::NoParity;
    }
    serialPort->setParity(parity);
    //弹出一个窗口告知用户初始化结果
    if (serialPort->open(QIODevice::ReadWrite)) {
        QMessageBox::information(this, "提示", "串口打开成功");
        //设置"打开串口"与"关闭串口"按钮互斥
        ui->btnOpenSerial->setEnabled(false);
        ui->btnCloseSerial->setEnabled(true);
    } else {
        QMessageBox::critical(this, "提示", "串口打开失败");
    }
}


/***********************************************************
  * @函数: on_btnCloseSerial_clicked
  * @功能: “关闭串口”按钮的槽函数
  * @参数: 无
  * @返回: 无
  *********************************************************/
void Widget::on_btnCloseSerial_clicked()
{
    serialPort->close();
    //设置"打开串口"与"关闭串口"按钮互斥
    ui->btnOpenSerial->setEnabled(true);
    ui->btnCloseSerial->setEnabled(false);
}


/***********************************************************
  * @函数: receiveMessage
  * @功能: 槽函数:接收信息
  * @参数: 无
  * @返回: 无
  *********************************************************/
void Widget::receiveMessage()
{
    QString buf = serialPort->readAll();
    ui->recvEdit->appendPlainText(buf);
}


/***********************************************************
  * @函数: on_btnSendMesg_clicked
  * @功能: “发送信息”按钮的槽函数
  * @参数: 无
  * @返回: 无
  *********************************************************/
void Widget::on_btnSendMesg_clicked()
{
    serialPort->write(ui->sendEdit->text().toUtf8());
}


/***********************************************************
  * @函数: on_btnClearRecv_clicked
  * @功能: “清除接收框”按钮的槽函数
  * @参数: 无
  * @返回: 无
  *********************************************************/
void Widget::on_btnClearRecv_clicked()
{
    ui->recvEdit->clear();
}


/***********************************************************
  * @函数: on_btnClearSend_clicked
  * @功能: “清除输入框”按钮的槽函数
  * @参数: 无
  * @返回: 无
  *********************************************************/
void Widget::on_btnClearSend_clicked()
{
    ui->sendEdit->clear();
}

3. 实现效果二

【1】为了进一步验证简易串口助手的功能,我们进行了如下的实验。

【2】首先,根据视频【虚拟串口创建工具】虚拟串口软件安装教程_哔哩哔哩_bilibili,我们安装了虚拟串口软件,并且产生了两个虚拟串口,如下图所示:

【3】其次,我们开发的串口助手连接com2,另一个串口工具连接com1。如下图所示,它们能够正常地收发数据,这再一次说明了我们开发的串口助手功能是正常的。

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

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

相关文章

Yolo-World训练过程中使用wandb进行可视化

训练过程可视化有两种方式&#xff1a;wandb和tensorboard&#xff0c;这里我采用的是wandb&#xff0c;想要在训练过程中调用wandb只需要在要训练的配置文件&#xff08;如yolo_world_v2_l_vlpan_bn_sgd_1e-3_40e_8gpus_finetune_coco.py&#xff09;中加上一行代码即可&#…

k8s+springboot+redis部署配置连接

1 springboot 配置k8s中的redis服务名 #tomcat访问端口 # 应用名称 spring.application.namedemo # 应用服务Web访问端口 server.port8089 server.envtest #缓存关闭 spring.thymeleaf.cachefalse #可选配置 management.endpoints.enabled-by-defaulttrue management.endpoint…

SpringBoot接入RS-232串口通讯实现数据交互

目录 一、什么是RS-232&#xff1f; 先看看硬件通讯接口长啥样 RS-232 二、方案一 1.前期准备 a.配置 RXTX 1&#xff09;下载 RXTX 包并解压 2&#xff09;拷贝动态库到对应的jdk目录下 Windows平台 Linux平台 3&#xff09;在工程根目录下创建 lib 文件夹&#x…

提升网络安全韧性:从基础防护开始

随着信息技术的迅猛发展&#xff0c;互联网已深刻融入社会的各个层面&#xff0c;从日常生活到企业运营&#xff0c;再到国家基础设施。与此同时&#xff0c;网络威胁和攻击也呈现出多样化和复杂化的趋势&#xff0c;给网络安全带来了严峻挑战。 一、背景 随着信息技术的迅猛发…

力扣每日一题 6/13 反悔贪心算法

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;IT竞赛 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 2813.子序列最大优雅度【困难】 题目&#xff1a; 给你一个长度为 n 的二…

使用pyqt对yolov5进行简答部署

YOLOv5是一种高效的实时目标检测算法&#xff0c;广泛应用于各类计算机视觉任务中。为了实现便捷的图形用户界面&#xff08;GUI&#xff09;&#xff0c;我们采用了PyQt框架。PyQt是一个Python绑定的Qt库&#xff0c;用于创建跨平台的应用程序。 在本研究中&#xff0c;我们首…

LINUX网络FTP服务

一、FTP服务 FTP服务&#xff1a;file transfer protocol :文件传输协议。在网络上进行双向传输&#xff0c;也是一个应用程序。不同的操作系统有不同的FTP软件&#xff0c;但使用的协议是一样的。 FTP协议基于TCP协议&#xff0c;有两个端口&#xff0c;即20和21。 20端口&…

GTX的64B66B编码(高速收发器十九)

点击进入高速收发器系列文章导航界面 前文讲解了8B10B的原理&#xff0c;8B10B的开销比较大&#xff0c;每传输10位数据&#xff0c;就需要发送2位无效数据。为了减小8B10B编码的开销&#xff0c;同时保留编码方案的优点&#xff0c;提出了64B66B编码。 64B66B编码与8B10B编码方…

批量记录收支明细,轻松掌握财务动向,查看并统计上个月收支明细

在这个快节奏的时代&#xff0c;财务管理已经成为我们生活中不可或缺的一部分。然而&#xff0c;面对繁琐的收支明细记录&#xff0c;很多人感到头痛不已。今天&#xff0c;我们为您推荐一款高效的财务管理工具——晨曦记账本&#xff0c;让您轻松实现批量记录收支明细&#xf…

HTML|01HTML初识

HTML初识 1.html标签&#xff1a;所有html中标签的一个根节点 2.head标签&#xff1a;用于存放&#xff1a;title,meta,base,style,script,link 3.title标签&#xff1a;显示网站标题 4.body标签&#xff1a;显示主体 HTML骨架语法 <html> <head> <title>…

数据防泄密知识集锦|5个有效防止数据泄露的方法,你知道吗?

以下是五个有效防止数据泄露的方法&#xff0c;它们涵盖了从加强员工意识到技术实施等多个方面。 1.部署数据安全防护系统&#xff1a;安企神软件 专业的企业数据防泄密软件能够全方位地保护企业数据的安全。 该系统通常具有强大的文件加密功能、实时监控和异常检测、灵活的权…

使用 PNPM 从零搭建 Monorepo,测试组件并发布

1 目标 通过 PNPM 创建一个 monorepo&#xff08;多个项目在一个代码仓库&#xff09;项目&#xff0c;形成一个通用的仓库模板。 这里以在该 monorepo 项目中搭建 web components 类型的组件库为例&#xff0c;介绍从仓库搭建、组件测试到组件发布的整个流程。 这个仓库既可…

eclipse 老的s2sh(Struts2+Spring+Hibernate) 项目 用import导入直接导致死机(CPU100%)的解决

1、下载Apache Tomcat - Apache Tomcat 8 Software Downloads 图中是8.5.100的版本&#xff0c;下面的设置用的是另一个版本的&#xff0c;其实是一样。 2、先将Server配好&#xff0c;然后再进行导入操作。 2、选择jdk 当然&#xff0c;这里也可以直接“Download and instal…

Vue指令的使用以及自定义指令

文章目录 1. 指令概述2.常用指令的分类2.1 内容渲染指令2.1.1 v-text2.1.2 插值语法{{ }}2.1.2.1 插值语法{{}}可以写什么2.1.2.2 插值语法可以解决什么 2.1.3 v-html 2.2 属性绑定指令(v-bind)2.3 事件绑定指令(v-on)2.4 双向绑定指令(v-model)2.4.1 v-bind和v-model的区别和联…

【Java】解决Java报错:IllegalStateException during HTTP Request

文章目录 引言一、IllegalStateException的定义与概述1. 什么是IllegalStateException&#xff1f;2. IllegalStateException在HTTP请求中的常见触发场景3. 示例代码 二、解决方案1. 确保响应只被提交一次2. 正确管理Servlet的生命周期3. 避免重复访问输入流和输出流4. 使用框架…

光储充行业市场前景以及未来发展趋势

光储充行业作为新能源汽车产业链的重要环节&#xff0c;其市场前景广阔&#xff0c;未来发展趋势也呈现出积极向上的态势。随着新能源汽车市场的不断扩大&#xff0c;光储充设施的需求也日益增长&#xff0c;为行业的发展提供了强大的动力。 从未来发展趋势来看&#xff0c;光储…

基于FreeRTOS+STM32CubeMX+LCD1602+MCP4251(SPI接口)的数字电位器Proteus仿真

一、简介&#xff1a; MCP4251是一款SPI接口的8位数字电位器。 二、主要技术参数&#xff1a; 属性参数值抽头数257接口类型SPI通道数2供电电压1.8V~5.5V精度20%温度系数(典型值)150ppm/℃工作温度-40℃~125℃ 三、引脚定义 &#xff1a; 四、内部原理框图&#xff1a; 五、电…

Github2024-06-12 开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-12统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4JavaScript项目2Lua项目1PHP项目1Blade项目1非开发语言项目1TypeScript项目1Shell项目1从零开始构建你喜爱的技术 创建周期:2156 天…

爬虫-电影影评爬取

先上代码 import requests import timeheaders {"referer": "http://movie.mtime.com/","user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36" } fo…

linux 安装sftp及使用sftp上传和下载

一、centos7 安装sftp 1.安装 OpenSSH 服务&#xff1a; sudo yum install openssh-server2.启动 SSH 服务&#xff0c;并设置为开机启动&#xff1a; sudo systemctl start sshd sudo systemctl enable sshd3.创建一个新用户&#xff0c;用于SFTP连接&#xff08;替换your_…