【QT】一个简单的串口通信小工具(QSerialPort实现)

news2025/2/24 15:43:25

目录

0.简介

1.展示结果

1)UI界面:

2)SSCOM(模拟下位机收发):

3)VSPD虚拟串口驱动(连接上位机和下位机的串口):

4)实际收发消息效果及视频演示

2.详细实现

1)代码实现

①界面搭建如下(控件拖拉即可)

②mainwindow.h

③mainwindow.cpp

3.用SSCOM模拟下位机传输需注意


0.简介

  • 最近在研究串口通信,我们用的是RS485通信(传输的是字节),然后需要用串口通信连接上位机和下位机,为此,写个小demo做练习。
  • 需求就是通过设置串口号、波特率等信息,连接两个串口,能够实现数据的发送和接收。
  • 我是基于qt的QSerialPort这个库实现的,在UI界面上可以输入发送的数据、接收发来的数据、清空log的操作。
  • 我用了SSCOM软件来模拟下位机的收发信息,用虚拟串口驱动软件(VSPD)将两个串口连接在一起。

1.展示结果

1)UI界面:

2)SSCOM(模拟下位机收发):

3)VSPD虚拟串口驱动(连接上位机和下位机的串口):

4)实际收发消息效果及视频演示

①UI界面发送数据,SSCOM模拟下位机接收消息

②SSCOM模拟下位机发送消息,UI界面作为上位机接受消息

视频中依次演示了:上位机收数据(SSCOM模拟下位机发送数据)以及上位机发送数据(SSCOM接收)的过程。

QSerialPort传输过程演示

2.详细实现

1)代码实现

QT项目,首先需要建一个带有图形界面的项目(此处不做赘述)

项目目录如下

①界面搭建如下(控件拖拉即可)

主要使用控件:QTextBrowser(日志打印显示控件)、QLabel、QLineEdit(上位机消息输入框)、两个QPushButton(点击可以清空log和发送消息)。

②mainwindow.h

主要就是3个槽函数的实现:接收消息、发送消息、清空文本框

完整代码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include <QSerialPort>
#include <QSerialPortInfo>

#include <QList>
#include <QDateTime>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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


public slots:
    void recvMsg();//接收消息的槽

private slots:
    void on_btn_send_clicked();//槽函数:点击发送消息按钮
    void on_btn_clear_clicked();//槽函数:点击清空log文本框

private:
    Ui::MainWindow *ui;
    QSerialPort *serialPort;
};
#endif // MAINWINDOW_H

③mainwindow.cpp

主要思路是:

  1. new一个QSerialPort对象,设置串口名;
  2. 打开串口;
  3. 配置串口;
  4. 读写串口;
  5. 关闭串口。

newQSerialPort+设置串口名:

打开串口:

配置串口:

读写串口:

析构函数关闭串口:

完整代码:

#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->serialPort = new QSerialPort;//申请内存
    this->serialPort->setPortName("COM3");//设置串口名COM3
    //判断串口是否打开
    if(this->serialPort->open(QIODevice::ReadWrite) == true){//用open函数打开串口,打开成功后,将成功的消息打印在log控件上
        ui->comLog->insertPlainText("Open Success\n");
    }else {
        QString str = QString("\n错误代码:%2\n%3").arg(serialPort->error()).arg(serialPort->errorString());//串口打开失败
        ui->comLog->insertPlainText("Open Fail");
        ui->comLog->insertPlainText(str);
    }
    this->serialPort->setBaudRate(115200);//设置波特率
    this->serialPort->setDataBits(QSerialPort::Data8);//设置数据位
    this->serialPort->setStopBits(QSerialPort::OneStop);//设置停止位
    this->serialPort->setParity(QSerialPort::NoParity);//设置是否有奇偶校验
    connect(this->serialPort, SIGNAL(readyRead()), this, SLOT(recvMsg()));//若下位机发送数据,用recvMsg槽接收
}

MainWindow::~MainWindow()
{
    delete ui;
    this->serialPort->close();
}

void MainWindow::recvMsg()
{
    QByteArray msg = this->serialPort->readAll();//读取数据
    //接到下位机发送的数据后,加时间打印在log控件上
    ui->comLog->insertPlainText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") + " [recieve] " + msg.toHex().data() + "\n");
}

void MainWindow::on_btn_clear_clicked()
{
    //清空log控件
    ui->comLog->clear();
}

void MainWindow::on_btn_send_clicked()
{
    //发送数据
    QString msg1 = ui->lineEdit->text();//获取界面上QLineEdit控件中的数据
    this->serialPort->write(QByteArray::fromHex(msg1.toLatin1()));//用write()接口写数据
    ui->comLog->insertPlainText(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss") + " [send] " + msg1 + "\n");//加时间打印在log控件上
}

3.用SSCOM模拟下位机传输需注意

1)SSCOM中的端口号应该与项目中的不同,然后两者用VSPD连接起来

我这边SSCOM的端口用的是【COM1】,项目中设置的端口是【COM3】,所以我在VSPD中连接的是【COM1和COM3】,此时上位机的端口就是COM3,下位机端口是COM1。

2)需要注意项目中的波特率需要与SSCOM中相同,我这里用的都是【115200】。

至此,串口的上下位机通信就完成了,只是一个简单的小demo,可能有描述不清楚的地方,有任何问题都可以留言~

--END--

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

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

相关文章

灵途科技亮相2024世界传感器大会 分享光纤光源技术突破

12月1日至2日&#xff0c;2024世界传感器大会&#xff08;WSS&#xff09;在郑州国际会展中心隆重举办&#xff0c;泛自动驾驶领域光电感知专家灵途科技受邀参加“光纤传感器与激光雷达”分论坛&#xff0c;并在大会上带来《激光雷达用一体化光纤光源》专题演讲&#xff0c;同与…

12月第1周AI资讯

阅读时间:3-4min 更新时间:2024.12.2-2024.12.6 目录 OpenAI CEO Sam Altman 预告“12天OpenAI”系列活动 腾讯HunyuanVideo:130亿参数的开源视频生成模型 李飞飞的World Labs发布空间智能技术预览版 中科院联手腾讯打造“AI带货王”AnchorCrafter OpenAI CEO Sam Alt…

CentOS7.X 安装RustDesk自建服务器实现远程桌面控制

参照文章CentOS安装RustDesk自建服务器中间总有几个位置出错&#xff0c;经实践做个记录防止遗忘 一 环境&工具准备 1.1 阿里云轻量服务器、Centos7系统、目前最高1.1.11版本rustdesk-server-linux-amd64.zip 1.2 阿里云轻量服务器–安全组–开放端口&#xff1a;TCP(21…

图形开发基础之在WinForms中使用OpenTK.GLControl进行图形绘制

前言 GLControl 是 OpenTK 库中一个重要的控件&#xff0c;专门用于在 Windows Forms 应用程序中集成 OpenGL 图形渲染。通过 GLControl&#xff0c;可以轻松地将 OpenGL 的高性能图形绘制功能嵌入到传统的桌面应用程序中。 1. GLControl 的核心功能 OpenGL 渲染上下文&…

指标加权评价方法

文章目录 层次分析法&#xff08;Analytic Hierarchy Process, AHP&#xff09;熵权法原理计算方法 Technique for Order Preference by Similarity to Ideal Solution(TOPSIS, 优劣解距离法)原理计算方法 层次分析法&#xff08;Analytic Hierarchy Process, AHP&#xff09; …

git管理Unity项目的正确方式

git管理Unity项目的正确打开方式 前言&#xff1a;对于刚开始git进行unity项目管理的时候&#xff0c;我采取的方式是全部文件上传&#xff0c;文件数量太多以及上传太大&#xff0c;我尝试过一下几个方法&#xff1a; 利用git的LFS大文件进行传方式&#xff0c;可行但比较麻…

GitToolBox插件:让IntelliJ IDEA的Git操作如虎添翼

GitToolBox插件介绍 GitToolBox是一款针对IntelliJ IDEA的插件&#xff0c;旨在增强IDE内置的Git功能&#xff0c;使Git操作更加便捷和高效。无论是单独开发者还是团队中的一员&#xff0c;这个插件都能帮助更好地管理代码和协作流程。 功能特点 分支管理&#xff1a;GitToolBo…

Golang 八股(持续补充...)

目录 进程、线程、协程 Go语言——垃圾回收 GC的触发条件 GC调优 GMP调度和CSP模型 Groutine的切换时机 Goroutine调度原理 Goroutine的抢占式调度 Context结构原理 Context原理 Golang内存分配机制 竞态、内存逃逸 golang内存对齐机制 golang中new和make的区别&a…

记录blender学习过程中遇到的问题

物体发射的方向不对 被发射物体&#xff08;例如一棵树&#xff09;n键看旋转归0 切换正视图 将被发射物体的局部坐标的Z轴 指向 全局方向的X轴时 并且把粒子系统设置的物体旋转勾选上 方向就对了 做倒角发现有问题 检查缩放应用、面朝向、有没有重合点&#xff08;融合点&am…

[免费]基于Python的Django在线(生鲜)商城(电子商城)管理系统【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的基于Python的Django在线(生鲜)商城(电子商城)管理系统&#xff0c;分享下哈。 项目视频演示 【免费】基于Python的Django在线(生鲜)商城(电子商城)管理系统 Python毕业设计_哔哩哔哩_bilibili 项目介绍 随…

Scala的正则表达式

应用场景 1.找到符合要求的子串 2.判断给的字符串是否符合要求 例如&#xff0c;在网站上注册用户&#xff0c;用户名的格式有要求&#xff01;

【Unity高级】如何动态调整物体透明度

本文介绍了如何设置及动态调整物体的透明度。 一、手动设置的方法 我们先来看下如何手动设置物体的透明度。 物体的透明与否是通过材质来设置的。只有我们把具有透明度的材质指给物体的渲染器&#xff08;Render&#xff09;&#xff0c;物体就被设置成相应的透明度了。 看一…

Java课程设计项目-servlet+jsp美食系统、菜品管理系统

文章目录 Java课程设计项目-servletjsp美食系统一、项目介绍二、技术介绍2.1 环境需要2.2 技术栈 环境需要三、功能实现3.1登录注册3.2首页菜品展示、轮播图3.3美食菜品分类、查询3.4作品动态、个人简介、菜品收藏3.5创建菜谱、添加步骤 四、系统代码展示4.1项目架构&#xff0…

掌握时间,从`datetime`开始

文章目录 掌握时间&#xff0c;从datetime开始第一部分&#xff1a;背景介绍第二部分&#xff1a;datetime库是什么&#xff1f;第三部分&#xff1a;如何安装这个库&#xff1f;第四部分&#xff1a;简单库函数使用方法1. 获取当前日期和时间2. 创建特定的日期3. 计算两个日期…

前端技术(23) : 聊天页面

来源: GPT生成之后微调 效果图 HTML代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>聊天</t…

ubuntu的matlab使用心得

1.读取视频 v VideoReader(2222.mp4);出问题&#xff0c;报错&#xff1a; matlab 错误使用 VideoReader/initReader (第 734 行) 由于出现意外错误而无法读取文件。原因: Unable to initialize the video properties 出错 audiovideo.internal.IVideoReader (第 136 行) init…

基于SpringBoot+Vue框架的在线考试系统的设计与实现

基于SpringBootVue框架的在线考试系统的设计与实现 系统合集跳转 源码获取链接 一、系统环境 运行环境: 最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 IDE环境&#xff1a; Eclipse,Myeclipse,IDEA或者Spring Tool Suite都可以 tomcat环…

软错误防护技术在车规MCU中应用

在大气层内&#xff0c;宇宙射线粒子与大气分子发生核反应生成大气中子。大气中子入射微电子器件或电路将会诱发单粒子效应&#xff08;SEE&#xff09;&#xff0c;效应类型主要有单粒子翻转&#xff08;SEU&#xff09;、单粒子瞬态&#xff08;SET&#xff09;、单粒子锁定&…

【数据中心建设资料】数据中心安全建设解决方案,数据中心整理解决方案,数据中心如何做到安全保障,数据中台全方案(Word全原件)

第一章 解决方案 1.1 建设需求 1.2 建设思路 1.3 总体方案 信息安全系统整体部署架构图 1.3.1 IP准入控制系统 1.3.2 防泄密技术的选择 1.3.3 主机账号生命周期管理系统 1.3.4 数据库账号生命周期管理系统 1.3.5 双因素认证系统 1.3.6 数据库审计系统 1.3.7 数据脱敏系统 1.3.8…

WLAN AutoConfig服务假死?重启服务恢复网络连接!

目录 背景&#xff1a; 过程&#xff1a; 可能引起原因&#xff1a; 具体解决步骤&#xff1a; 方法一&#xff1a; 方法二&#xff1a; 总结&#xff1a; 背景&#xff1a; 这个问题困扰我好长一段时间了&#xff0c;每次下班将电脑关机后&#xff0c;次日早上电脑开机…