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

【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--

相关文章:

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

目录 0.简介 1.展示结果 1&#xff09;UI界面&#xff1a; 2&#xff09;SSCOM&#xff08;模拟下位机收发&#xff09;&#xff1a; 3&#xff09;VSPD虚拟串口驱动&#xff08;连接上位机和下位机的串口&#xff09;&#xff1a; 4&#xff09;实际收发消息效果及视频演…...

24/12/5 算法笔记<强化学习> doubleDQN,duelingDQN

我们前面了解了DQN网络的一些知识&#xff0c;然而DQN还有一些改进的方法&#xff0c;比如doubleDQN和duelingDQN,我们先来将一下doubleDQN和DQN. 先来对比一下 单一网络 vs. 双重网络 DQN:是一个深度神经网络来估计每个动作的Q值 DDQN:使用两个独立的深度神经网络&#xf…...

道可云人工智能元宇宙每日资讯|全国工商联人工智能委员会成立会议在南京举办

道可云元宇宙每日简报&#xff08;2024年12月5日&#xff09;讯&#xff0c;今日元宇宙新鲜事有&#xff1a; 全国工商联人工智能委员会成立会议在南京举办 全国工商联人工智能委员会成立会议日前在江苏省南京市举办。中央统战部副部长、全国工商联党组书记沈莹出席会议并讲话…...

MySQL数据库(2)-检查安装与密码重置

1. 数据库下载安装 下载地址&#xff1a;MySQL :: Download MySQL Community Server 2. My.ini配置文件 my.ini 文件通常在MySQL安装过程中自动创建&#xff0c; 并且可以根据需要进行编辑以调整服务器的行为。 3. 配置环境变量 4. 查询版本号 查询版本号&#xff1a;mysql…...

C# 13 中的新增功能

C# 12 中的新增功能C# 11 中的新增功能C# 10 中的新增功能C# 9.0 中的新增功能C# 8.0 中的新增功能C&#xff03;7.0中有哪些新特性&#xff1f;C#6.0中10大新特性的应用和总结C# 5.0五大新特性 将C#语言版本升级为预览版 C# 13 包括一些新增功能。 可以使用最新的 Visual Stu…...

视频自学笔记

一、视频技术基本框架 二、视频信号分类 2.1信号形式 2.1.1模拟视频 模拟视频是指由连续的模拟信号组成的视频图像&#xff0c;以前所接触的电影、电视都是模拟信号&#xff0c;之所以将它们称为模拟信号&#xff0c;是因为它们模拟了表示声音、图像信息的物理量。摄像机是获…...

easyexcel 导出日期格式化

1.旧版本 在新的版本中formate已经被打上废弃标记。那么不推荐使用这种方式。 2.推荐方式 推荐使用另外一种方式【 Converter 】代码如下&#xff0c;例如需要格式化到毫秒【yyyy-MM-dd HH:mm:ss SSS】级别 创建一个公共Converter import com.alibaba.excel.converters.Conv…...

02-开发环境搭建

02-开发环境搭建 鸿蒙开发环境的准备主要分为以下环节&#xff1a; 注册开发者实名认证创建应用下载安装开发工具新建工程 注册开发者 在华为开发者联盟网站上&#xff0c;注册成为开发者&#xff0c;并完成实名认证。 打开华为开发者联盟官网&#xff0c;点击“注册”进入…...

DBeaver导入csv到数据库

DBeaver的图标是一只小浣熊&#xff0c;查了下Beaver确实是浣熊的意思&#xff0c;看起来还是蛮可爱的。 业务上有需要导入csv到数据库的需求&#xff0c;试用了下&#xff0c;发现挺好用的。有很多属性可以定制。 导入步骤&#xff1a; 1.建表&#xff0c;表字段与待导入cs…...

React第十一节 组件之间通讯之发布订阅模式(自定义发布订阅器)

组件之间通讯常用方案 1、通过props 2、通过context 3、通过发布订阅模式 4、通过Redux 后面会有专栏介绍 什么情况下使用发布订阅模式 a、当我们想要兄弟组件之间通讯&#xff0c;而共同的父组件中又用不到这些数据时候&#xff1b; b、当多个毫无相关的组件之间想要进行数据…...

tcpreplay/tcpdump-重放网络流量/捕获、过滤和分析数据包

tcpdump 是一个网络数据包分析工具&#xff0c;通过捕获并显示网络接口上传输的数据包&#xff0c;帮助用户分析网络流量。 原理&#xff1a;用户态通过 libpcap 库控制数据包捕获&#xff0c;内核态通过网卡驱动获取数据包。 核心功能包括&#xff1a;捕获、过滤和分析数据包…...

ASPICE评估体系概览:对象、范围与参考标准解析

ASPICE&#xff08;汽车软件过程改进和能力确定&#xff09;是一个框架&#xff0c;它被广泛应用于汽车行业的软件开发和维护过程的改进。 它类似于软件工程领域的CMMI&#xff08;能力成熟度模型集成&#xff09;&#xff0c;但专门针对汽车行业&#xff0c;考虑了该行业特有…...

力扣92.反转链表Ⅱ

题目描述 题目链接92. 反转链表 II 给你单链表的头指针 head 和两个整数 left 和 right &#xff0c;其中 left < right 。请你反转从位置 left 到位置 right 的链表节点&#xff0c;返回 反转后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], left …...

Java设计模式之适配器模式:深入JDK源码探秘Set类

在Java编程中&#xff0c;Set类作为一个不允许存储重复元素的集合&#xff0c;广泛应用于数据去重、集合运算等场景。然而&#xff0c;你是否曾好奇Set类是如何在底层实现元素唯一性判断的&#xff1f;这背后隐藏的力量正是适配器模式。 适配器模式简介 适配器模式&#xff0…...

java八股-流量封控系统

文章目录 请求后台管理的频率-流量限制流量限制的业务代码UserFlowRiskControlFilter 短链接中台的流量限制CustomBlockHandler 对指定接口限流UserFlowRiskControlConfigurationSentinelRuleConfig 请求后台管理的频率-流量限制 根据登录用户做出控制&#xff0c;比如 x 秒请…...

【WebRTC】Android SDK使用教学

文章目录 前言PeerConnectionFactoryPeerConnection 前言 最近在学习WebRTC的时候&#xff0c;发现只有JavaScript的API文档&#xff0c;找了很久没有找到Android相关的API文档&#xff0c;所以通过此片文章记录下在Android应用层如何使用WebRTC 本篇文章结合&#xff1a;【W…...

基于单片机的智能晾衣控制系统的设计与实现

摘要:本文是以 AT89C52 单片机为核心来实现智能晾衣控制系统。在这个系统中,雨水检测传感器是用来检测出雨的,而控制器将检测信号的变换,根据变换后的信号自动驱动直流电机将被风干 的棒收回,以便随时控制直流电机来实现晾衣;在光敏模块中检测昼夜的环境,自动控制晾衣杆…...

多人聊天室 NIO模型实现

NIO编程模型 Selector监听客户端不同的zhuangtai不同客户端触发不同的状态后&#xff0c;交由相应的handles处理Selector和对应的处理handles都是在同一线程上实现的 I/O多路复用 在Java中&#xff0c;I/O多路复用是一种技术&#xff0c;它允许单个线程处理多个输入/输出&…...

三、使用 Maven:命令行环境

文章目录 1. 第一节 实验一&#xff1a;根据坐标创建 Maven 工程1.1 Maven 核心概念&#xff1a;坐标1.2 实验操作1.3 Maven核心概念&#xff1a;POM1.4 Maven核心概念&#xff1a;约定的目录结构 2. 实验二&#xff1a;在 Maven 工程中编写代码2.1 主体程序2.2 测试程序 3. 执…...

Blender导入下载好的fbx模型像的骨骼像针戳/像刺猬

为什么我下载下来的骨骼模型和我自己绑定的模型骨骼朝向完全不一样 左边是下载的模型 右边是我自己绑定的模型 左边的模型刚刚感觉都是像针一样往外戳的&#xff0c;像刺猬一样那种。 解决方法勾选自动骨骼坐标系...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

VB.net复制Ntag213卡写入UID

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

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

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

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...