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

目录

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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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.rhkb.cn/news/484855.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python语法基础---正则表达式(补充)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 上一篇文章中&#xff0c;我们讲到了贪婪匹配和非贪婪匹配&#xff0c;我们在这篇文章中&#xff0c;主要讲的就是贪婪匹配和非贪婪匹配的剩下的部分&#xff0c;话不多说&#x…

Elasticsearch数据迁移(快照)

1. 数据条件 一台原始es服务器&#xff08;192.168.xx.xx&#xff09;&#xff0c;数据迁移后的目标服务器&#xff08;10.2.xx.xx&#xff09;。 2台服务器所处环境&#xff1a; centos7操作系统&#xff0c; elasticsearch-7.3.0。 2. 为原始es服务器数据创建快照 修改elas…

golang实现单例日志对象

原文地址&#xff1a;golang实现单例日志对象 – 无敌牛 欢迎参观我的个人博客&#xff1a;无敌牛 – 技术/著作/典籍/分享等 介绍 golang有很多日志包&#xff0c;通过设置和修改都能实现日志轮转和自定义日志格式。例如&#xff1a;log、zap、golog、slog、log4go 等等。 …

7. 一分钟读懂“单例模式”

7.1 模式介绍 单例模式就像公司里的 打印机队列管理系统&#xff0c;无论有多少员工提交打印任务&#xff0c;大家的请求都汇总到唯一的打印管理中心&#xff0c;按顺序排队输出。这个中心必须全局唯一&#xff0c;避免多个队列出现资源冲突&#xff0c;保证打印任务井然有序。…

【AI系统】布局转换原理与算法

布局转换原理与算法 数据布局转换目前已经越来越多地用于编译器的前端优化&#xff0c;将内部数据布局转换为后端设备友好的形式。数据布局转换主要影响程序的空间局部性&#xff0c;所谓空间局部性指的是如果一个内存位置被引用了一次&#xff0c;那么程序很可能在不远的将来…

GPS周和周内秒 UTC时 格林尼治时间

1.GPS周和周内秒介绍 GPS周和周内秒是全球定位系统&#xff08;GPS&#xff09;中用于时间表示的两个重要概念&#xff0c;它们共同构成了GPS时间系统。以下是对这两个概念的详细介绍&#xff1a; GPS周&#xff08;GPS Week&#xff09; GPS周是GPS系统内部所采用的时间单位…

Java-异常处理机制-try-catch

Java-异常处理机制 一、异常概述1、异常的抛出机制2、如何对待异常3、异常的体系结构3.1、Throwable3.2、Error和Exception3.3、编译时异常和运行时异常3.4、常见的异常有哪些&#xff1f; 二、异常的处理方式一 try-catch的使用1、过程1&#xff1a;抛2、过程2&#xff1a;抓3…

在Ubuntu22.04.5上安装Docker-CE

文章目录 1. 查看Ubuntu版本2. 安装Docker-CE2.1 安装必要的系统工具2.2 信任Docker的GPG公钥2.3 写入软件源信息2.4 安装Docker相关组件2.5 安装指定版本Docker-CE2.5.1 查找Docker-CE的版本2.5.2 安装指定版本Docker-CE 3. 启动与使用Docker3.1 启动Docker服务3.2 查看Docker…

【趋势红蓝交易】主图指标操盘技术图文展示,注意要点,通达信炒股软件指标

如上图&#xff0c;主图指标【趋势红蓝交易】&#xff0c;蓝色线下空头趋势&#xff0c;不进场操作或只做超短线的反弹行情。红线之上多头行情&#xff0c;顺势做多&#xff0c;波段和趋势多头操作。 多空操作区间K线变色功能&#xff0c;上涨区间红色K线&#xff0c;叠加紫色趋…

网络协议(TCP/IP模型)

目录 网络初识 网络协议 协议分层 协议拆分 分层 协议分层的优势 1.封装效果 2.解耦合 TCP/IP五层模型 协议之间配合工作&#xff08;详解&#xff09; 网络初识 网络核心概念&#xff1a; 局域网&#xff1a;若干电脑连接在一起&#xff0c;通过路由器进行组网。 …

基于图和个性化PageRank的RAG方法HippoRAG

HippoRAG是2024年5月的一篇论文《HippoRAG: Neurobiologically Inspired Long-Term Memory for Large Language Models》(github)&#xff0c;它受人脑长期记忆的启发(Hippo是海马体英文单词的前缀)&#xff0c;用知识图谱(KG)来存储知识&#xff0c;并用检索编码器和个性化Pag…

【电子设计】WifiESP8266无线通信

硬件 野火STM32开发板 操作系统 FreeRTOS 软件Keil5野火蓝牙模块 ESP8266模块 1. ESP8266 简介 ESP8266 是串口型 WIFI&#xff0c;速度比较低&#xff0c;不能用来传输图像或者视频这些大容量的数据&#xff0c;主要应用于数据量传输比较少的场合&#xff0c;比如温湿度…

《Clustering Propagation for Universal Medical Image Segmentation》CVPR2024

摘要 这篇论文介绍了S2VNet&#xff0c;这是一个用于医学图像分割的通用框架&#xff0c;它通过切片到体积的传播&#xff08;Slice-to-Volume propagation&#xff09;来统一自动&#xff08;AMIS&#xff09;和交互式&#xff08;IMIS&#xff09;医学图像分割任务。S2VNet利…

单体应用、SOA和微服务架构有什么区别?

大家好&#xff0c;我是锋哥。今天分享关于【单体应用、SOA和微服务架构有什么区别&#xff1f;】面试题。希望对大家有帮助&#xff1b; 单体应用、SOA和微服务架构有什么区别&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 单体应用&#xff08;Mono…

实习冲刺第四十天

54.螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 思路详解&#xff1a;本题我们可以设置…

第11篇 计算数据中最长的连续1的个数__ARM C语言<四>

Q&#xff1a;如何设计ARM C语言程序将结果&#xff08;最长的连续1的个数&#xff09;显示在7段数码管上&#xff1f; A&#xff1a;基本原理与ARM汇编语言程序类似&#xff0c;也是对HEX并行端口对应内存映射地址进行写操作。如要在HEX0上显示数字0&#xff0c;就点亮除数码…

软件无线电安全之GNU Radio基础(下)

往期回顾 软件无线电安全之GUN Radio基础(上) 背景 在上一小节中&#xff0c;我们简单介绍和使用了GNU Radio软件的基础功能和模块&#xff0c;同时通过GNU Radio Companion&#xff08;GRC&#xff09;创建了简单的流程图&#xff0c;展示了信号生成、处理和输出的流程。最后…

用点云信息来进行监督目标检测

&#x1f351;个人主页&#xff1a;Jupiter. &#x1f680; 所属专栏&#xff1a;传知代码 欢迎大家点赞收藏评论&#x1f60a; 目录 概述问题分析Making Lift-splat work well is hard深度不准确深度过拟合不准确的BEV语义 模型总体框架显性深度监督 深度细化模块演示效果核心…

Issue id: AppLinkUrlError 应用intent-filter 配置深链接 URL 问题分析 | AndroidManifest

AndroidManifest.xml 配置文件中&#xff0c;对 activity 组件进行声明的时候&#xff0c;独立应用在 IDE 显示 intent-filter 报错&#xff0c;但不影响实际编译&#xff0c;因为是系统应用&#xff0c;肯定会有此 URL 的存在。 AOSP 源码&#xff1a; <activity android:…

视频监控汇聚平台:Liveweb安防监控平台实现接入监控视频集中管理方案

随着各行业数字化转型的不断推进&#xff0c;视频监控技术在行业内的安防应用及管理支撑日益增多。然而&#xff0c;由于前期规划不清晰、管理不到位等问题&#xff0c;视频监管系统普遍存在以下问题&#xff1a; 1. 各部门单位在视频平台建设中以所属领域为单位&#xff0c;导…