当前位置: 首页 > news >正文

QT实现串口通信

一.Qt串口通信

Qt提供了两个关于串口通信的C++类,分别是QSerialPort和QSerialPortInfo。

QSerialPort类提供了操作串口的各种接口。

QSerialPortInfo是一个辅助类,可以提供计算机中可用的串口的各种信息。

QSerialPortInfo Class用于提供外部串行端口的信息。

使用静态函数生成一个QSerialPortInfo对象的列表。列表中的每个QSerialPortInfo对象存储着单个串行端口的信息,可以查询端口名称,系统位置,描述和制造商。QSerialPortInfo类也可作为QSerialPort类中setPort()方法的输入参数。

二.代码实现

1.在头文件中引入 QtSerialPort 类的两个头文件(必须引入)

#include <QtSerialPort/QSerialPort>         // 提供访问串口的功能

#include <QtSerialPort/QSerialPortInfo>     // 提供系统中存在的串口信息

2.在工程文件中添加以下代码

# 引入串口工程类型,pro文件添加

QT   += serialport

3.代码

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include <QDebug>

MainWindow::MainWindow(QWidget *parent) :

    QMainWindow(parent),

    ui(new Ui::MainWindow)

{

    ui->setupUi(this);

    //查找可用的串口

    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())

    {

        qDebug() << "Port Name:" << info.portName();

        QSerialPort serial;

        serial.setPort(info);

        if(serial.open(QIODevice::ReadWrite))

        {

            ui->PortBox->addItem(serial.portName());

            serial.close();

        }

    }

    //设置波特率下拉菜单默认项

    ui->BaudBox->setCurrentIndex(7);

    //关闭发送按钮的使能

    ui->sendButton->setEnabled(false);

}

MainWindow::~MainWindow()

{

    delete ui;

}

//清空接受窗口

void MainWindow::on_clearButton_clicked()

{

    ui->textEdit->clear();

}

//发送数据

void MainWindow::on_sendButton_clicked()

{

    serial->write(ui->textEdit_2->toPlainText().toLatin1());

}

//读取接收到的数据

void MainWindow::Read_Data()

{

    QByteArray buf;

    buf = serial->readAll();

    qDebug() << buf;

    if(!buf.isEmpty())

    {

        QString str = ui->textEdit->toPlainText();

        str+=tr(buf);

        ui->textEdit->clear();

        ui->textEdit->append(str);

    }

    buf.clear();

}

void MainWindow::on_openButton_clicked()

{

    if(ui->openButton->text()==tr("打开串口"))

    {

        serial = new QSerialPort;

        //设置串口名

        serial->setPortName(ui->PortBox->currentText());

        //打开串口

        serial->open(QIODevice::ReadWrite);

        //设置波特率

        serial->setBaudRate(ui->BaudBox->currentText().toInt());

        //设置数据位数

        switch(ui->BitNumBox->currentIndex())

        {

        case 8: serial->setDataBits(QSerialPort::Data8); break;

        default: break;

        }

        //设置奇偶校验

        switch(ui->ParityBox->currentIndex())

        {

        case 0: serial->setParity(QSerialPort::NoParity); break;

        default: break;

        }

        //设置停止位

        switch(ui->StopBox->currentIndex())

        {

        case 1: serial->setStopBits(QSerialPort::OneStop); break;

        case 2: serial->setStopBits(QSerialPort::TwoStop); break;

        default: break;

        }

        //设置流控制

        serial->setFlowControl(QSerialPort::NoFlowControl);

        //关闭设置菜单使能

        ui->PortBox->setEnabled(false);

        ui->BaudBox->setEnabled(false);

        ui->BitNumBox->setEnabled(false);

        ui->ParityBox->setEnabled(false);

        ui->StopBox->setEnabled(false);

        ui->openButton->setText(tr("关闭串口"));

        ui->sendButton->setEnabled(true);

        //连接信号槽

        QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data);

    }

    else

    {

        //关闭串口

        serial->clear();

        serial->close();

        serial->deleteLater();

        //恢复设置使能

        ui->PortBox->setEnabled(true);

        ui->BaudBox->setEnabled(true);

        ui->BitNumBox->setEnabled(true);

        ui->ParityBox->setEnabled(true);

        ui->StopBox->setEnabled(true);

        ui->openButton->setText(tr("打开串口"));

        ui->sendButton->setEnabled(false);

    }

}

void MainWindow::on_pushButton_clicked()

{

    //刷新可用的串口

    ui->PortBox->clear();

    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())

    {

        QSerialPort serial;

        serial.setPort(info);

        if(serial.open(QIODevice::ReadWrite))

        {

            ui->PortBox->addItem(serial.portName());

            serial.close();

        }

    }

}

4.运行界面

5.modbus 项目工程示例

代码可以在博客资源内下载:https://download.csdn.net/download/xieliru/88850765

(1)client界面

(2)Server界面

相关文章:

QT实现串口通信

一.Qt串口通信 Qt提供了两个关于串口通信的C类&#xff0c;分别是QSerialPort和QSerialPortInfo。 QSerialPort类提供了操作串口的各种接口。 QSerialPortInfo是一个辅助类&#xff0c;可以提供计算机中可用的串口的各种信息。 QSerialPortInfo Class用于提供外部串行端口的…...

微信小程序 --- 通用模块封装(showToast,showModal ,本地存储)

目录 01. 为什么进行模块封装 02. 消息提示模块封装 03. 模态对话框封装 04. 封装本地存储 API 05. 拓展:封装异步存储API优化代码 01. 为什么进行模块封装 在进行项目开发的时候&#xff0c;我们经常的会频繁的使用到一些 API&#xff0c; 例如&#xff1a;wx.showToast…...

基于springboot+vue的音乐网站(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…...

pclpy 最小二乘法拟合平面

pclpy 最小二乘法拟合平面 一、算法原理二、代码三、结果1.左边原点云、右边最小二乘法拟合平面后点云投影 四、相关数据 一、算法原理 平面方程的一般表达式为&#xff1a; A x B y C z D 0 ( C ≠ 0 ) Ax By Cz D 0 \quad (C\neq0) AxByCzD0(C0) 即&#xff1a; …...

蓝桥杯备战刷题(自用)

1.被污染的支票 #include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() {int n;cin>>n;vector<int>L;map<int,int>mp;bool ok0;int num;for(int i1;i<n;i){cin>>nu…...

Python习题详解

练习&#xff1a; 1&#xff0c;计算100以内奇数的和 #计算100以内所有奇数的和 sum 0 # n 1 # while n < 100: # # sum sum n # sum n # # n n 2 # n 2 # print(sum) n 99 #求偶数时n 100 while n > 0:sum n# n n - 2n - 2 print(sum)2&#xff0c;打印直…...

绩效考核利器:Excel报表模板,解锁企业高效员工评价新境界

一、背景与目标 在现今的企业管理中&#xff0c;绩效考核是一项至关重要的任务。它旨在评估员工的工作表现&#xff0c;激励员工积极进取&#xff0c;同时也是制定薪酬、晋升、培训等决策的重要依据。为了满足这一需求&#xff0c;我们设计了一款绩效考核Excel报表模板&#x…...

如何使用Lychee+cpolar搭建本地私人图床并实现远程访问存储图片

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…...

跨境支付介绍

1、跨境电商定义和分类&#xff1b; 2、国际贸易清结算&#xff1b; 3、跨境支付&#xff1b; 1、跨境电商定义和分类 跨境电商业务简单说就是指不同国家地域的主体通过电子商务进行交易的一种业务模式。同传统的电商不同&#xff0c;交易双方属于不同的国家。因此&#xff0…...

如何在Linux搭建MinIO服务并实现无公网ip远程访问内网管理界面

文章目录 前言1. Docker 部署MinIO2. 本地访问MinIO3. Linux安装Cpolar4. 配置MinIO公网地址5. 远程访问MinIO管理界面6. 固定MinIO公网地址 前言 MinIO是一个开源的对象存储服务器&#xff0c;可以在各种环境中运行&#xff0c;例如本地、Docker容器、Kubernetes集群等。它兼…...

Cortex-M可以跑Linux操作系统吗?

在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01; Cortex-M系列微控制器主要设计…...

日志系统项目(2)项目实现(实用工具类、日志等级类、日志消息类、日志格式化输出类)

前面的文章中我们讲述了日志系统项目的前置知识点&#xff0c;再本文中我们将开始日志项目的细节实现。 日志系统框架设计 本项目实现的是一个多日志器日志系统&#xff0c;主要实现的功能是让程序员能够轻松的将程序运行日志信息落地到指定的位置&#xff0c;且支持同步与异…...

剑指offer面试题19 二叉树的镜像

考察点 树的遍历知识点 题目 分析 我们分析算法题目的思路基本上都是归纳法&#xff0c;即通过举一些普通的例子来推理出算法流程&#xff0c;而画图又是举例子的常用手段&#xff0c;比如针对树或者链表画画图&#xff0c;针对数字类的举一些数字的例子寻找规律&#xff0c…...

SpringCloud Alibaba 2022之Nacos学习

SpringCloud Alibaba 2022使用 SpringCloud Alibaba 2022需要Spring Boot 3.0以上的版本&#xff0c;同时JDK需要是17及以上的版本。具体的可以看官网的说明。 Spring Cloud Alibaba版本说明 环境搭建 这里搭建的是一个聚合项目。项目结构如下&#xff1a; 父项目的pom.xm…...

js之数组遍历

for 可以用来遍历数组、字符串、类数组、DOM节点&#xff0c;可以更改原数组&#xff0c;可以使用break、continue 跳出循环 return 只能在函数内部使用 for(声明循环变量&#xff1b;判断循环条件&#xff1b;更新循环变量){循环体 }forEach 参数&#xff08;当前元素&#x…...

极狐GitLab 16.9 重磅发布,快来 pick 你心仪的功能吧~【五】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 沿袭我们的月度发版机制&#xff0c;今天我们正式发布极狐GitL…...

如何在本地部署密码管理软件bitwarden并结合cpolar实现远程同步

文章目录 1. 拉取Bitwarden镜像2. 运行Bitwarden镜像3. 本地访问4. 群晖安装Cpolar5. 配置公网地址6. 公网访问Bitwarden7. 固定公网地址8. 浏览器密码托管设置 Bitwarden是一个密码管理器应用程序&#xff0c;适用于在多个设备和浏览器之间同步密码。自建密码管理软件bitwarde…...

DT DAY3 信号和槽

作业&#xff1a; 1> 思维导图 2> 使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 btn3 new QPushButton("按钮3",this);btn3->resize(ui->btn2->width(),ui->b…...

Spring、SpringBoot、SpringCloud三者的区别

Spring、Spring Boot 和 Spring Cloud 是构建企业级 Java 应用程序的不同层次的框架和工具。下面详细介绍它们之间的区别&#xff1a; 1. Spring框架&#xff1a; 概述&#xff1a; Spring 是一个全功能的企业级 Java 框架&#xff0c;提供了依赖注入、面向切面编程、事务管理…...

leetcode:46.全排列

1.什么是排列&#xff1f; 有顺序&#xff01;&#xff01; 2.树形结构&#xff1a; 使用used数组进行标记取过的元素&#xff0c;一个元素一个元素地进行取值&#xff0c;取完之后将used数组进行标记。 3.代码实现&#xff1a;&#xff08;循环从i0开始&#xff0c;而不是…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

Java面试专项一-准备篇

一、企业简历筛选规则 一般企业的简历筛选流程&#xff1a;首先由HR先筛选一部分简历后&#xff0c;在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如&#xff1a;Boss直聘&#xff08;招聘方平台&#xff09; 直接按照条件进行筛选 例如&#xff1a…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...