qt串口编程

article/2025/9/28 10:09:27

第一步在pro文件加入:

QT    +=serialport代码如下:QT       += core gui
QT    +=serialportgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked 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 it uses 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 \mainwindow.cppHEADERS += \mainwindow.hFORMS += \mainwindow.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

第二步需要加入的头文件:

#include<QtSerialPort/QtSerialPort>

第三步获取当前电脑可用串口名字:

QSerialPortInfo::availablePorts();//将返回一个含有电脑当前的可用串口名字QList<QSerialPortInfo>容器

第四步定义一个串口对象并且设置串口名字,数据,校验,停止等等:

第一步: QSerialPort *serial=new QSerialPort(this);//定义创建一个串口
第二步:serial->setPortName(ui->comboBox->currentText());//设置串口名字里面参数为字符串
第三步:serial->setBaudRate(ui->comboBox->currentText().toInt());//设置波特率面参数为数字
第四步: serial->setDataBits(QSerialPort::Data5);//设置数据位这个参数是qt定义的枚举类型
第五步:serial->setParity(QSerialPort::EvenParity);//设置校验位,参数也是个qt自定义的枚举类型
第六步:serial->setStopBits(QSerialPort::OneStop);//设置停止位,参数也是个qt自定义的枚举类型
第七步:serial->setFlowControl(QSerialPort::NoFlowControl);//设置流控,参数也是个qt自定义的枚举类型
第八步:serial->open(QIODevice::ReadWrite);//以读写的方式打开串口成功与失败都会有返回值  
第八步: serial->close();//关闭串口

第五步设置串口有消息来需要响应的槽函数并且显示消息:

第一步定义一个串口有消息来要处理的槽函数:
private slots:
void serialPort_readyRead();//当串口有消息来的时候促发的槽函数
第二步设置信号和槽:
connect(serial,&QSerialPort::readyRead,this,&MainWindow::serialPort_readyRead);
第三步定义槽函数:
void MainWindow::serialPort_readyRead()//当串口有消息来的时候促发的槽函数
{qDebug()<<"Reveive data";
}
第四步接收信息:
QString Receivetext=serial->readAll();//这个的格式位QString接收到的信息
可以把接收到的信息转化为两总格式:
第一种://ASCIIReceivetext=Receivetext.toLatin1();
第二种://十六进制Receivetext=Receivetext.toLatin1().toHex();

第六步发送消息:

发送消息方法:QByteArray bytearray;serial->write(bytearray);//参数类型为QByteArray

下面就是我学习写的一个串口助手源码:

头文件#include "mainwindow.h":#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#pragma execution_character_set("utf-8")
#include <QMainWindow>
#include<QtSerialPort/QtSerialPort>
#include<QTimer>
#include<QMessageBox>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();
private slots:void TimcrEvent();//定义一个槽函数专门处理定时器槽函数(自定义)void serialPort_readyRead();//当串口有消息来的时候促发的槽函数(自定义)void on_pushButton_clicked();//打开串口转到槽void on_checkBox_clicked();//接收格式ASSCII点击后转到槽void on_checkBox_2_clicked();//十六进制点击后转到槽void on_checkBox_3_clicked();//暂停转到槽void on_pushButton_2_clicked();//串口通信发送信息void on_pushButton_3_clicked();//清空接收区转到void on_pushButton_4_clicked();//清空发送区转到槽private:Ui::MainWindow *ui;QTimer   *timcr;//定义一个定时器QStringList  portStringList;//定义一个容器用来验证是否有串口需要添加QSerialPort *serial;//定义一个串口QString Receivetext;//获取串口发来的信息long  Receive_Byte;//统计收到的字节QString Sendtext;//要发送的信息long Send_Byte;//统计发送了多少字节};
#endif // MAINWINDOW_H源文件#include "mainwindow.h":#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);resize(800,600);setWindowTitle("串口调试助手");timcr=new QTimer(this);//new 一个定时器timcr->start(500);//设置500时间发送一个信号connect(timcr,&QTimer::timeout,this, &MainWindow::TimcrEvent);serial=new QSerialPort(this);//创建一个串口ui->comboBox_2->setCurrentIndex(5);ui->comboBox_3->setCurrentIndex(3);ui->comboBox_4->setCurrentIndex(2);ui->comboBox_5->setCurrentIndex(0);Receive_Byte=0;Send_Byte=0;connect(serial,&QSerialPort::readyRead,this,&MainWindow::serialPort_readyRead);ui->checkBox->setCheckState(Qt::Checked);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::TimcrEvent()//检测当前电脑的槽函数
{QStringList  newPortStringList; //定义一个string容器newPortStringList.clear();foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())//foreach是qt定义的一个按照顺序遍历容器的循环{newPortStringList +=info.portName();//info就是遍历的成员,它的portName()方法是转化为QString类型}if(newPortStringList.size()!=portStringList.size())//判断是否有新的串口或者取出串口{portStringList=newPortStringList;ui->comboBox->clear();ui->comboBox->addItems( portStringList);}
}void MainWindow::serialPort_readyRead()//当串口有消息来的时候促发的槽函数
{QString last_text;int length;int i;if(ui->checkBox_3->checkState()!=Qt::Checked){last_text=ui->textEdit->toPlainText();Receivetext=serial->readAll();Receive_Byte+=Receivetext.length();ui->label_9->setText(QString::number(Receive_Byte));if(ui->checkBox_2->checkState()==Qt::Checked)//十六进制{Receivetext=Receivetext.toLatin1().toHex();length=Receivetext.length();for(i=0;i<=length/2;i++){Receivetext.insert(2+3*i,' ');}}else//ASCII{Receivetext=Receivetext.toLatin1();}last_text=last_text.append(Receivetext);ui->textEdit->setText(last_text );}}void MainWindow::on_pushButton_clicked()//打开串口
{if(ui->pushButton->text()==QString("打开串口")){serial->setPortName(ui->comboBox->currentText());//设置串口名字serial->setBaudRate(ui->comboBox_2->currentText().toInt());//设置波特率switch (ui->comboBox_3->currentText().toInt())//设置数据位{case 5:serial->setDataBits(QSerialPort::Data5);break;case 6:serial->setDataBits(QSerialPort::Data6);break;case 7:serial->setDataBits(QSerialPort::Data7);break;case 8:serial->setDataBits(QSerialPort::Data8);break;default:serial->setDataBits(QSerialPort::UnknownDataBits);}switch (ui->comboBox_4->currentIndex())//设置校验位{case 0: break;//偶校验case 1:serial->setParity(QSerialPort::OddParity);break;//奇校验case 2:serial->setParity(QSerialPort::NoParity);break;//无校验default:serial->setParity (QSerialPort::UnknownParity);break;}switch (ui->comboBox_5->currentIndex())//停止位{case 0:serial->setStopBits(QSerialPort::OneStop);break;//1case 1:serial->setStopBits(QSerialPort::OneStop);break;//1.2case 2:serial->setStopBits(QSerialPort::OneStop);break;//2default:serial->setStopBits(QSerialPort::UnknownStopBits);}serial->setFlowControl(QSerialPort::NoFlowControl);//设置流控if(!serial->open(QIODevice::ReadWrite)){QMessageBox::information(this,"错误提示","无法打开串口",QMessageBox::Ok);return;}ui->comboBox->setEnabled(false);ui->comboBox_2->setEnabled(false);ui->comboBox_3->setEnabled(false);ui->comboBox_4->setEnabled(false);ui->comboBox_5->setEnabled(false);ui->pushButton->setText("关闭串口");}else{serial->close();ui->comboBox->setEnabled(true);ui->comboBox_2->setEnabled(true);ui->comboBox_3->setEnabled(true);ui->comboBox_4->setEnabled(true);ui->comboBox_5->setEnabled(true);ui->pushButton->setText("打开串口");}
}void MainWindow::on_checkBox_clicked()//接收格式ASSCII点击后转到槽
{ui->checkBox->setCheckState(Qt::Checked);ui->checkBox_2->setCheckState(Qt::Unchecked);ui->checkBox_3->setCheckState(Qt::Unchecked);}void MainWindow::on_checkBox_2_clicked()//十六进制点击后转到槽
{ui->checkBox->setCheckState(Qt::Unchecked);ui->checkBox_2->setCheckState(Qt::Checked);ui->checkBox_3->setCheckState(Qt::Unchecked);
}void MainWindow::on_checkBox_3_clicked()//暂停转到槽
{ui->checkBox->setCheckState(Qt::Unchecked);ui->checkBox_2->setCheckState(Qt::Unchecked);ui->checkBox_3->setCheckState(Qt::Checked);
}void MainWindow::on_pushButton_2_clicked()//串口通信发送信息
{QByteArray bytearray;Sendtext=ui->textEdit_2->toPlainText();bytearray=Sendtext.toLatin1();serial->write(bytearray);Receive_Byte+=Sendtext.length();ui->label_11->setText(QString::number(Receive_Byte));
}void MainWindow::on_pushButton_3_clicked()//清空接收区
{ui->textEdit->clear();
}void MainWindow::on_pushButton_4_clicked()//清空发送区
{ui->textEdit_2->clear();
}

ui布局:

 


http://chatgpt.dhexx.cn/article/vOyGXfmo.shtml

相关文章

Qt基础编程

什么是Qt Qt就是c的一种跨操作系统平台的可视化开发工具 qt5.15.2的下载 下载安装链接 安装过程中出现network error while......时的解决办法 创建项目 application是什么 application应用程序 作用 QApplication---界面应用入口 也就是 只要是要建立界面的QT项目都需…

Qt入门使用Qt编写程序详细全过程

1、 双击打开Qt 2、 点击文件&#xff08;F&#xff09; 3、 选择新建文件或项目 4、 选择Application 5、 选择Qt Widgets Application 6、 点击choose 7、 输入项目名称&#xff08;英文&#xff09; 8、 点击下一步 9、 点击下一步 10、 点击完成 11、 一个没有…

Qt编程基础:认识常用的基本类型

前言 上一节已经成功创建了一个Qt项目&#xff0c;接下来就是要在创建好的项目中&#xff0c;添加自己想要的功能。在写代码之前&#xff0c;我们需要掌握Qt的一些基础知识。 语法部分就不用讲了&#xff0c;这系列文章是对有C或C语言基础的同学展开的&#xff0c;如果一点编…

[QT入门篇]编程基础知识

一、坐标体系 在 Qt 中窗口的显示是需要指定位置的&#xff0c;这个位置是通过坐标来确定的&#xff0c;所有坐标的选取都是基于坐标原点来确定的&#xff0c;Qt的坐标原点在窗口的左上角。 在一个 Qt 窗口中一般都有很多子窗口内嵌到这个父窗口中&#xff0c;其中每个窗口都有…

QT高级编程之QT基本概览

QT高级编程 主要从以下几个方面来介绍QT高级编程&#xff0c;并介绍QT相关的概念。 1、 QT部件Widget&#xff1b; 2、 QT信号与槽机制&#xff1b; 3、 对象树关系&#xff1b; 4、 布局管理&#xff1b; 5、标准对话框以及自定义对话框&#xff1b; 6、文件与目录&#xff…

QT5编程入门教程(非常详细)

Qt 是一个跨平台的 C 框架&#xff08;C库&#xff09;&#xff0c;目前最新的版本是 Qt5。Qt5 还包含了很多小版本&#xff0c;其中推荐 Qt5.6 或 Qt5.9&#xff0c;这两个版本是 LTS 版本&#xff08;即长期支持版本&#xff09;&#xff0c;Bug较少&#xff0c;相对稳定。 Q…

取模和与运算的一点关系

与n取模其实就是和n-1相与 当然是在二进制基础上 在HashMap的 先高16位异或低16位再取模运算 取模运算转化成位运算公式:a%(2^n) 等价于 a&(2^n-1),而&操作比%操作具有更高的效率

负数的与运算

计算机中的位运算是基于补码的。正数的原码反码补码相同&#xff0c;而负数有一些差别。 如&#xff1a; 7的补码为0111 -7的补码为1001。其计算过程为先算出7的原码0111&#xff0c;按位取反得1000&#xff0c;在加上1得1001。这个步骤也是其他负数计算补码的方式。 示例&…

数与运算

数学是研究数与运算的一门科学&#xff0c;数和运算都是人类根据自然界的客观规律抽象出来的&#xff0c;人们利用抽象的假定去研究更高层次客观规律&#xff0c;再利用这些客观规律解决自然界中出现的问题&#xff0c;这就是数学学科的用途。 数学中的数由什么组成的&#xff…

C/C++:与运算、或运算、异或运算、指针

前言忘记进制的同学先看这里&#xff1a; 十进制数&#xff0c;没有前缀 二进制数&#xff0c;前缀是0b 八进制数&#xff0c;前缀是0o 十六进制数&#xff0c;前缀是0xlet decimalInteger 17 let binaryInteger 0b10001 // 二进制的17 let octalInteger 0o21 …

“”是什么含义?与运算入门级讲解;什么是与运算?

与运算&#xff08;AND&#xff09;是计算机中最基础、最常用的一种逻辑运算&#xff0c;也被称为按位与&#xff08;Bitwise AND&#xff09;运算。它是指在二进制数中&#xff0c;对两个二进制数的每一位进行逻辑与操作&#xff0c;只有当两个二进制数的对应位都为1时&#x…

数字电路三种基本逻辑运算关系:与运算、或运算、非运算

1、基本概念 1.逻辑常量与变量&#xff1a;逻辑常量只有两个&#xff0c;即0和1&#xff0c;用来表示两个对立的逻辑状态。逻辑变量与普通代数一样&#xff0c;也可以用字母、符号、数字及其组合来表示&#xff0c;但它们之间有着本质区别&#xff0c;因为逻辑变量的取值只…

二进制与运算、或运算、非运算

与运算 "与"运算是计算机中一种基本的逻辑运算方式&#xff0c;符号表示为&&#xff0c;运算法则为遇0得0。也就是说只要有0&#xff0c;结果即为0。 举例 或运算 "或"运算符号表示为|&#xff0c;运算法则为遇1得1。也就是说只要有1&#xff0c;结…

​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​

说明 所有的位运算符操作的都是二进制&#xff0c;而不是我们日常生活中常用的十进制。 在系统中&#xff0c;一个字节占8位。 按位与运算符&#xff08;&&#xff09; 参加运算的两个数据&#xff0c;按二进制位进行“与”运算。 运算规则&#xff1a;如果两个二进制…

第三章 运算方法与运算器

文章目录 定点补码加减法运算补码加减法运算方法溢出及检测溢出检测操作数与运算结果的符号位是否一致最高位的进位和符号位的进位是否一致变形补码 补码加减法的逻辑实现 移码加减运算及实现逻辑移码的加法运算移码加减法的溢出判断直接采用移码运算的溢出判断方法采用双符号判…

2019做报表用什么软件:报表类型,产品推荐

在大数据时代&#xff0c;报表可以帮助我们从海量数据中挖掘有用的数据&#xff0c;选择软件做什么就变得尤为重要。选择什么类型的软件进行报表?推荐哪些报表产品?本文请一位专业的数据分析师&#xff0c;介绍选择报表软件的经验。 ……阅读更多&#xff0c;请戳原文链接&am…

免费报表软件有哪些?5款热门工具

在企业管理过程中&#xff0c;报表往往都会通过一些简洁的图表方式&#xff0c;为大家呈现所有的数据。报表软件&#xff0c;可以在操作的过程中有效提升工作效率&#xff0c;所以有很多企业早就已经选择跟随信息技术的潮流&#xff0c;选择报表软件工具。很多人也一直都在关注…

分享几款好用免费的报表软件_报表软件推荐

Smartbi Insight Smartbi Insight&#xff08;企业报表平台&#xff09;以中国式报表、多维度分析、可视化仪表盘为核心&#xff0c;满足报表需求的功能以“真Excel”为特色&#xff0c;将Office Excel和WPS表格变为企业级WEB报表设计器&#xff0c;表格样式与计算逻辑的灵活性…

JimuReport积木报表 v1.5.8版本发布—免费的数据可视化报表

项目介绍 一款免费的数据可视化报表&#xff0c;含报表和大屏设计&#xff0c;像搭建积木一样在线设计报表&#xff01;功能涵盖&#xff0c;数据报表、打印设计、图表报表、大屏设计等&#xff01; Web 版报表设计器&#xff0c;类似于excel操作风格&#xff0c;通过拖拽完成报…

报表开发流程

报表开发是数据分析师的常见工作之一。报表是业务监控必备工具之一(用数据说话)&#xff0c;另一方面&#xff0c;报表监控的指标通常都是业务相关的重要指标&#xff0c;做报表的过程也是深入了解业务的过程。 把数据分析分为“描述、解释、预测、控制”4个层级。那么报表开发…