通过QT基于C++实现串口通信

1.软件下载

本文所用到的所有软件都在以下连接可以下载

QT下载(注意下载路径最好全英,不要出现中文容易有bug)

链接:https://pan.baidu.com/s/1XCPlTBQ8fBOKBYO-H0mSVg?pwd=m28f 
提取码:m28f

串口工具下载

链接:https://pan.baidu.com/s/19Wc4XuANIZeaB6Qz1jeb6w?pwd=ysez 
提取码:ysez

1.添加串口

添加的串口最好选大一点的,编号小的串口一般系统在用。

选择要添加的串口号,点击添加端口

测试端口之间是否可以正常通信

确保串口设置的参数相同

打开串口

在串口数据接受模块输入数据并发送,检测是否正常通信

2.建立QT文件

输入文件名和地址,点击下一步

下一步

基类选择QWidget,点击下一步

3.代码

uart.pro

#-------------------------------------------------
#
# Project created by QtCreator 2024-07-01T11:52:24
#
#-------------------------------------------------QT       += core gui serialport    #串口通信
greaterThan(QT_MAJOR_VERSION, 4): QT += widgetsTARGET = uart
TEMPLATE = app# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked as deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += main.cpp\widget.cppHEADERS  += widget.hFORMS    += widget.ui

widget.h

#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include <QSerialPort>  //串口编程namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();void InitWidget();private slots:void on_open_bt_clicked();   //打开串口函数void OnReadyData();void on_send_bt_clicked();private:Ui::Widget *ui;QSerialPort *m_pSerial;  //数据类型为指向串口的指针
};#endif // WIDGET_H

main.cpp

#include "widget.h"
#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);Widget w;w.InitWidget();w.show();return a.exec();
}

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QDebug>  //Qt 提供的输出调试信息的工具。Widget::Widget(QWidget *parent) : //Widget类继承自QWidgetQWidget(parent),ui(new Ui::Widget)//通过ui对象初始化界面布局
{ui->setupUi(this);m_pSerial = NULL;//初始化m_pSerial为NULL,用于管理串口对象。
}Widget::~Widget() //析构函数释放了ui对象。
{delete ui;
}void Widget::InitWidget()  //设置界面初始状态,创建串口对象
{qDebug()  << "Widget::InitWidget() enter";   //输出if (NULL  == m_pSerial){m_pSerial  = new QSerialPort(this);connect(m_pSerial, SIGNAL(readyRead()), this, SLOT(OnReadyData()));//这是一个 Qt 中的信号与槽语法,其中m_pSerial是一个串口对象,readyRead()是serialPort对象的一个信号,表示有数据可以读取。//this 是一个指向当前类的指针,onReadyRead()是当前类中的一个槽函数,用于处理seria1Port对象的readyRead()信号。}ui->data_edit->setEnabled(false); //按钮不可点击ui->textEdit->setEnabled(false);ui->send_bt->setEnabled(false);qDebug()  << "Widget::InitWidget() exit";
}void Widget::on_open_bt_clicked()  //打开或关闭串口,并设置串口的参数(波特率、数据位、停止位、校验位等)
{qDebug()  << "Widget::on_open_bt_clicked() enter";if (NULL == m_pSerial){qDebug()  << "serial obj error";return;}QString strBt = ui->open_bt->text();  //获取open_bt的按钮的文本内容,并将其存储在变量 strBt 中if (strBt == "open")  //检查一个按钮的文本内容,并根据按钮文本的不同执行不同的操作{QString strCom = ui->uart_com->currentText();  //ui->uart_com是一个下拉框,currentText()用于获取当前选中的文本内容,即串口名称。if (strCom.length() == 0) //串口名称的长度为0,错误{qDebug() << "com port error";return;}m_pSerial->setPortName(strCom); //串口名m_pSerial->setBaudRate(QSerialPort::Baud9600);  //波特兰m_pSerial->setDataBits(QSerialPort::Data8);  //数据位m_pSerial->setStopBits(QSerialPort::OneStop);  //停止位m_pSerial->setParity(QSerialPort::NoParity);  //校验位m_pSerial->setFlowControl(QSerialPort::NoFlowControl);  //流控制if (!m_pSerial->isOpen())  //判断串口m_pSerial 是否已经打开,若未打开{if (m_pSerial->open(QIODevice::ReadWrite))  //QSerialPort类的方法,用于尝试以读写模式打开串口。若成功打开执行以下内容{qDebug()  <<  "open ok";ui->open_bt->setText("close");  //按钮上的文字变为closeui->data_edit->setEnabled(true);  //按钮可点击ui->textEdit->setEnabled(true);ui->send_bt->setEnabled(true);ui->uart_com->setEnabled(false);}else{qDebug()  << "open error";}}}else{m_pSerial->close();ui->open_bt->setText("open");  //按钮上的文字变为openui->data_edit->setEnabled(false);ui->textEdit->setEnabled(false);ui->send_bt->setEnabled(false);ui->uart_com->setEnabled(true);}qDebug()  << "Widget::on_open_bt_clicked() exit";
}void Widget::OnReadyData() //串口数据就绪槽函数,当串口有数据可读时,该函数会被调用
{qDebug()  << "Widget::OnReadyData() enter";QByteArray arr = m_pSerial->readAll();  //读取串口的所有数据,并将其转换为字符串QString strData = ui->textEdit->toPlainText();  //从名为textEdit的文本编辑框中获取纯文本内容,存储在strData中。//toPlainText(): 是QTextEdit类的方法,用于获取文本编辑框中的所有纯文本内容。if (strData.length() > 0){strData.append("\nrecv: ");  //将一个字符串 "\nrecv: " 追加到已经存在的strData变量中。}else{strData.append("recv: ");}strData.append(QString(arr));  //将一个QByteArray类型的变量arr转换为QString类型,并将其追加到strData变量的末尾。ui->textEdit->setText(strData);  //将接收到的数据附加到界面上的文本编辑框 textEdit 中,并显示为接收的数据qDebug()  << "Widget::OnReadyData() exit";
}void Widget::on_send_bt_clicked() //发送数据按钮的槽函数
{qDebug()  << "Widget::on_send_bt_clicked() enter";QString strData = ui->data_edit->text(); //当点击发送数据按钮时,首先获取用户输入的数据if (strData.length() == 0)  //如果发送的数据长度为0,输出发送数据长度为0{qDebug() << "send data length is 0";return;}int iRet = m_pSerial->write(strData.toStdString().data());  //将数据发送到串口,并返回发送字节数if (iRet != -1){QString strText = ui->textEdit->toPlainText();  //从名为textEdit的文本编辑框中获取当前显示的所有纯文本内容,并将其存储在strText中。if (strText.length() > 0){strText.append("\nsend: ");}else{strText.append("send: ");}strText.append(strData);ui->textEdit->setText(strText);  //如果发送成功,将发送的数据附加到界面上的文本编辑框 textEdit 中,并显示为发送的数据}qDebug()  << "Widget::on_send_bt_clicked() exit";
}

widget.ui

这里直接用模块进行搭建,不需要用代码。不想搭建的也可以直接用下面的代码。

注意右上角的对象和类。对象名和类必须和这里一样,不然上面代码有的地方要改。

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>Widget</class><widget class="QWidget" name="Widget"><property name="geometry"><rect><x>0</x><y>0</y><width>611</width><height>418</height></rect></property><property name="windowTitle"><string>Widget</string></property><widget class="QComboBox" name="uart_com"><property name="geometry"><rect><x>100</x><y>30</y><width>87</width><height>22</height></rect></property><item><property name="text"><string>COM1</string></property></item><item><property name="text"><string>COM2</string></property></item><item><property name="text"><string>COM3</string></property></item><item><property name="text"><string>COM4</string></property></item><item><property name="text"><string>COM5</string></property></item><item><property name="text"><string>COM6</string></property></item><item><property name="text"><string>COM7</string></property></item><item><property name="text"><string>COM8</string></property></item><item><property name="text"><string>COM9</string></property></item><item><property name="text"><string>COM10</string></property></item></widget><widget class="QLabel" name="label"><property name="geometry"><rect><x>20</x><y>30</y><width>72</width><height>15</height></rect></property><property name="text"><string>串口号</string></property></widget><widget class="QPushButton" name="open_bt"><property name="geometry"><rect><x>280</x><y>30</y><width>93</width><height>28</height></rect></property><property name="text"><string>open</string></property></widget><widget class="QTextEdit" name="textEdit"><property name="geometry"><rect><x>30</x><y>80</y><width>371</width><height>221</height></rect></property></widget><widget class="QLineEdit" name="data_edit"><property name="geometry"><rect><x>30</x><y>330</y><width>271</width><height>21</height></rect></property></widget><widget class="QPushButton" name="send_bt"><property name="geometry"><rect><x>320</x><y>330</y><width>93</width><height>28</height></rect></property><property name="text"><string>send</string></property></widget></widget><layoutdefault spacing="6" margin="11"/><resources/><connections/>
</ui>

4.测试

点击运行

输入刚刚创建的串口号,点击open

输入要发送的内容

点击send发送

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

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

相关文章

二十、Qt位置相关函数

目录 一、函数概述 二、函数实践 三、总结 一、函数概述 Qt 提供了很多关于获取窗体位置及显示区域大小的函数&#xff0c;如 x()、y()和 pos()、react()、size()、geometry()等&#xff0c;统称为“位置相关函数”或“位置函数”&#xff0c; 如下图所示是几种主要的位置函数…

JS 鼠标拖动实现移动滚动条的滚动效果

效果 现在很多场景都以移动端为基本开发&#xff0c;比如说需要隐藏滚动条&#xff0c;在pc上实现鼠标拖动和手机触摸拖动差不多的效果。 实现 以mdn的overflow属性中范例为基础&#xff0c;内容溢出时候可使用overflow: auto;和overflow: scroll;实现滚动效果。 要实现鼠标…

华为防火墙总部与分支机构建立IPsec VPN涉及NAT穿越

一、IPsec VPN基本概念 1、隧道建立方式&#xff1a;分为手动建立和IKE自动协商&#xff0c;手动建立需要人为配置指定所有IPsec建立的所有参数信息&#xff0c;不支持为动态地址的发起方&#xff0c;实际网络中很少应用&#xff1b;IKE协议是基于密钥管理协议ISAKMP框架设计而…

一文看懂AI的 Transformer 架构!

1 AI的转换器是啥&#xff1f; 转换器&#xff0c;一种将输入序列转换或更改为输出序列的神经网络架构。它们通过学习上下文和跟踪序列组件之间的关系来做到这一点。例如&#xff0c;请考虑以下输入序列&#xff1a;“天空是什么颜色的&#xff1f;” 转换器模型会使用内部数学…

C4D2024软件下载+自学C4D 从入门到精通【学习视频教程全集】+【素材笔记】

软件介绍与下载&#xff1a; 链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1n8cripcv6ZTx4TBNj5N04g?pwdhfg5 提取码&#xff1a;hfg5 基础命令的讲解&#xff1a; 掌握软件界面和基础操作界面。学习常用的基础命令&#xff0c;如建模、材质、灯光、摄像机…

TypeScript体操(一):从基础到进阶

目录 前言Utility Types 是什么&#xff1f;常用 Utility Types前置知识typeofkeyoftypeof 和 keyof 的区别never 关键字extends 关键字结合条件判断infer 类型推断&#xff08;模式匹配&#xff09;判断是与非判断两个类型是否相等或兼容 循环递归嵌套字符串数组协变&#xff…

NMEA2000在船舶控制系统中航空插头插座组件特性

NMEA2000在船舶控制系统中的应用概述 NMEA2000协议是船舶电子设备之间通信的国际标准&#xff0c;广泛应用于船舶导航、监控和自动化系统。它基于CAN&#xff08;Controller Area Network&#xff09;总线技术&#xff0c;以确保在恶劣环境下的可靠性和效率。NMEA2000协议定义了…

英语语法第八课副词

文章目录 1、副词分类1.1 时间副词&#xff0c;表示时间或频率1.2 地点副词&#xff0c;表示地点或位置1.3 方式副词&#xff0c;表示行为方式1.4 程度副词&#xff0c;表示动作程度1.5 疑问副词&#xff0c;引导特殊疑问句1.6 强调副词&#xff0c;强调形容词或动词1.7 连接副…

隐语隐私计算实训营「联邦学习」第 5 课:基于隐私保护的机器学习算法介绍

【隐私计算实训营】是蚂蚁集团隐语开源社区出品的线上课程&#xff0c;自实训营上线以来&#xff0c;获得行业内外广泛关注&#xff0c;吸引上千余名开发者报名参与。本次暑期夏令营课程中&#xff0c;除了最新上线的「联邦学习系列」&#xff0c;还包含了「隐私保护数据分析」…

Java项目实战springboot校园失物招领系统

✌网站介绍&#xff1a;✌10年项目辅导经验、专注于计算机技术领域学生项目实战辅导。 ✌服务范围&#xff1a;Java(SpringBoo/SSM)、Python、PHP、Nodejs、爬虫、数据可视化、小程序、安卓app、大数据等设计与开发。 ✌服务内容&#xff1a;免费功能设计、免费提供开题答辩P…

3D建模软件--犀牛Rhino for Mac

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff0c;等待安装完毕2、应用程序显示软件图标&#xff0c;表示安装成功 三、运行测试安装完成&#xff01;&#xff01;&#xff01; 效果 一、下载软件 下载软件…

初学Mybatis之配置解析

MyBatis 中文网配置教程 mybatis-config.xml 环境配置&#xff08;environments&#xff09; 尽管可以配置多个环境&#xff0c;但每个 SqlSessionFactory 实例只能选择一种环境 可以有多个 enviroment&#xff0c;但是 enviroments default&#xff08;默认&#xff09;只…

动态规划题目:单词拆分/三角形最小路径和 - leetcode

动态规划思想 / 步骤 &#xff1a; 先将 当前要求 总结成一个 精炼的 小问题 &#xff0c; 然后 将 求解题目 转换为 求解N个 小问题 &#xff0c; 每个小问题的 求解过程相同 &#xff0c;但是 过程涉及 的 数据 是不同的 &#xff0c; 例如第三个 小问…

c++网络编程实战——开发基于ftp协议的文件传输模块(二) 配置ftp服务与手动执行ftp命令

配置FTP服务 一.前言 博主的环境是阿里云服务器&#xff0c;操作系统版本为 ubuntu20.04,一下所有操作都基于以上环境下进行的操作&#xff0c;同时为了简化操作我将开放同一个云服务器的不同端口&#xff0c;让它同时充当服务端和客户端&#xff0c;大家如果想测试效果更好且…

WPF串口通讯程序

目录 一 设计原型 二 后台源码 一 设计原型 二 后台源码 using HardwareCommunications; using System.IO.Ports; using System.Windows;namespace PortTest {/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainW…

软件缺陷(Bug)、禅道

目录 软件缺陷的判定标准 软件缺陷的核心内容 构成缺陷的基本要素 缺陷报告 缺陷管理 缺陷的跟踪流程 项目管理工具--禅道 软件在使用过程中存在的任何问题&#xff08;如&#xff1a;错误、异常等&#xff09;&#xff0c;都叫软件的缺陷&#xff0c;简称bug。 软件缺…

如何选择海洋船舶用总线NMEA 2000连接器

NMEA 2000连接器概述 NMEA 2000连接器是现代船舶通信系统中不可或缺的部分&#xff0c;主要用于连接船上各种电子设备&#xff0c;实现数据传输和设备控制。这些连接器遵循NMEA 2000协议标准&#xff0c;支持高速数据传输&#xff0c;并具有良好的防水、耐腐蚀性能&#xff0c…

神经网络之循环神经网络

目录 一、循环神经网络概述&#xff1a;1.传统神经网络与循环神经网络的区别&#xff1a;2.循环神经网络定义&#xff1a; 图片来自&#xff1a;深度学习———循环神经网络 一、循环神经网络概述&#xff1a; 1.传统神经网络与循环神经网络的区别&#xff1a; MLP、卷积神经…

【PostgreSQL教程】PostgreSQL 选择数据库

博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…

多目标遗传算法(NSGAⅢ)的原理和matlab实现

参考文献&#xff1a; [1] Deb K , Jain H .An Evolutionary Many-Objective Optimization Algorithm Using Reference-Point-Based Nondominated Sorting Approach, Part I: Solving Problems With Box Constraints[J].IEEE Transactions on Evolutionary Computation, 2014,…