Qt QSerialPort数据发送和接收DataComm

文章目录

    • Qt QSerialPort数据发送和接收DataComm
    • 2.添加 Qt Serial Port 模块
    • 3.实例源码

Qt QSerialPort数据发送和接收DataComm

Qt 框架的Qt Serial Port 模块提供了访问串口的基本功能,包括串口通信参数配置和数据读写,使用 Qt Serial Port 模块就可以很方便地编写具有串口通信功能的应用程序。

  1. 创建一个基于QMainWindow应用程序
    选择项目类型

2.添加 Qt Serial Port 模块

Qt Serial Port 模块用于串口通信编程,要在一个项目中使用 Qt Serial Port 模块,需要在项目配置文件中加入一行语句:QT += serialport
Qt Serial Port 模块中只包含有两个类:QSerialPortInfo QSerialPort

3.实例源码

头文件datacomm.h

#ifndef DATACOMM_H
#define DATACOMM_H#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QTimer>QT_BEGIN_NAMESPACE
namespace Ui {
class DataComm;
}
QT_END_NAMESPACEclass DataComm : public QMainWindow
{Q_OBJECTpublic:DataComm(QWidget *parent = nullptr);~DataComm();
private slots:void clear_recv();void clear_send();void on_com_recv();void on_com_send();void on_com_open();void on_com_changed(int index);void on_timeout();void on_check_state_changed(int);void get_interval();
private:void send();Ui::DataComm *ui;QSerialPort comPort;bool bCircle;int interval;QTimer *timer;QByteArray stdCmd;QString strCmd;
};
#endif // DATACOMM_H

源文件datacomm.cpp

#include "datacomm.h"
#include "ui_datacomm.h"
#include <QMessageBox>DataComm::DataComm(QWidget *parent): QMainWindow(parent), ui(new Ui::DataComm)
{ui->setupUi(this);foreach (QSerialPortInfo portInfo, QSerialPortInfo::availablePorts()) {ui->comboBoxPort->addItem(portInfo.portName());}ui->comboBoxPort->setCurrentIndex(2);connect(ui->comboBoxPort,SIGNAL(currentIndexChanged(int)),this,SLOT(on_com_changed(int)));ui->pushButtonOpen->setEnabled(ui->comboBoxPort->count()>0);ui->pushButtonSend->setEnabled(false);connect(ui->pushButtonOpen,SIGNAL(clicked()),this,SLOT(on_com_open()));connect(ui->pushButtonSend,SIGNAL(clicked()),this,SLOT(on_com_send()));ui->comboBoxBaud->clear();foreach (qint32 baud, QSerialPortInfo::standardBaudRates()) {ui->comboBoxBaud->addItem(QString::number(baud));}ui->comboBoxBaud->setCurrentText("9600");ui->comboBoxCheck->addItem("NONE");ui->comboBoxCheck->addItem("ODD");ui->comboBoxCheck->addItem("EVEN");ui->comboBoxCheck->addItem("SPACE");ui->comboBoxCheck->addItem("MARK");ui->comboBoxFlowCtrl->addItem("NONE");ui->comboBoxFlowCtrl->addItem("HARD");ui->comboBoxFlowCtrl->addItem("SOFT");ui->comboBoxDataBit->addItem("5");ui->comboBoxDataBit->addItem("6");ui->comboBoxDataBit->addItem("7");ui->comboBoxDataBit->addItem("8");ui->comboBoxDataBit->setCurrentText("8");ui->comboBoxStopBit->addItem("1");ui->comboBoxStopBit->addItem("1.5");ui->comboBoxStopBit->addItem("2");timer = new QTimer(this);ui->lineEditTime->setText("1000");interval = 1000;connect(ui->pushButtonClearRecv,&QPushButton::clicked,this,&DataComm::clear_recv);connect(ui->pushButtonClearSend,&QPushButton::clicked,this,&DataComm::clear_send);connect(timer,&QTimer::timeout,this,&DataComm::on_timeout);connect(ui->lineEditTime,&QLineEdit::textChanged,this,&DataComm::get_interval);connect(&comPort,&QIODevice::readyRead,this,&DataComm::on_com_recv);connect(ui->checkBoxCircle,&QCheckBox::stateChanged,this,&DataComm::on_check_state_changed);resize(800,600);
}DataComm::~DataComm()
{delete ui;
}void DataComm::clear_recv()
{ui->plainTextEditRecv->clear();
}void DataComm::clear_send()
{ui->plainTextEditSend->clear();
}
void DataComm::on_com_open()
{if(comPort.isOpen()) {comPort.close();ui->comboBoxPort->setEnabled(true);ui->comboBoxBaud->setEnabled(true);ui->comboBoxCheck->setEnabled(true);ui->comboBoxDataBit->setEnabled(true);ui->comboBoxStopBit->setEnabled(true);ui->comboBoxFlowCtrl->setEnabled(true);ui->pushButtonSend->setEnabled(false);ui->pushButtonOpen->setText("打开");}else {int index = ui->comboBoxPort->currentIndex();QList<QSerialPortInfo> comList = QSerialPortInfo::availablePorts();QSerialPortInfo portInfo = comList.at(index);comPort.setPort(portInfo);comPort.setReadBufferSize(2048);comPort.setBaudRate(ui->comboBoxBaud->currentText().toInt());int value = ui->comboBoxDataBit->currentText().toInt();comPort.setDataBits(QSerialPort::DataBits(value));value = ui->comboBoxCheck->currentText().toInt();if(value != 0) {value ++;}comPort.setParity(QSerialPort::Parity(value));value = ui->comboBoxStopBit->currentText().toInt();comPort.setStopBits(QSerialPort::StopBits(value));value = ui->comboBoxFlowCtrl->currentText().toInt();comPort.setFlowControl(QSerialPort::FlowControl(value));if(comPort.open(QIODevice::ReadWrite)) {ui->comboBoxPort->setEnabled(false);ui->comboBoxBaud->setEnabled(false);ui->comboBoxCheck->setEnabled(false);ui->comboBoxDataBit->setEnabled(false);ui->comboBoxStopBit->setEnabled(false);ui->comboBoxFlowCtrl->setEnabled(false);ui->pushButtonSend->setEnabled(true);ui->pushButtonOpen->setText("关闭");}}
}void DataComm::get_interval()
{int val = ui->lineEditTime->text().toInt();if(val > 0) {interval = val;}else {ui->lineEditTime->setText(QString::number(interval));}
}void DataComm::on_check_state_changed(int)
{bCircle = ui->checkBoxCircle->isChecked();if(!bCircle) {if(timer->isActive()) {timer->stop();ui->pushButtonSend->setEnabled(true);}}
}
void DataComm::send()
{ui->plainTextEditRecv->appendPlainText("Tx: "+ strCmd );comPort.write((const QByteArray )stdCmd);
}void DataComm::on_com_send()
{strCmd =  ui->plainTextEditSend->toPlainText();if(strCmd.isEmpty()) {QMessageBox::information(this,tr("发送内容为空"),tr("发送内容为空!"));return;}QByteArray ba = QByteArray (strCmd.toUtf8());stdCmd = ba;send();bCircle = ui->checkBoxCircle->isChecked();if(bCircle) {ui->pushButtonSend->setEnabled(false);timer->start(interval);}
}void DataComm::on_timeout()
{send();
}void DataComm::on_com_recv()
{if(comPort.bytesAvailable()) {comPort.waitForReadyRead(100);QByteArray all = comPort.read(1024);QString str(all);if(!str.isEmpty()){ui->plainTextEditRecv->appendPlainText("Rx: "+ str );}}
}void DataComm::on_com_changed(int index)
{}

源文件main.cpp

#include "datacomm.h"#include <QApplication>
#include <QLocale>
#include <QTranslator>int main(int argc, char *argv[])
{QApplication a(argc, argv);QTranslator translator;const QStringList uiLanguages = QLocale::system().uiLanguages();for (const QString &locale : uiLanguages) {const QString baseName = "DataCom_" + QLocale(locale).name();if (translator.load(":/i18n/" + baseName)) {a.installTranslator(&translator);break;}}DataComm w;w.show();return a.exec();
}

nguages) {
const QString baseName = “DataCom_” + QLocale(locale).name();
if (translator.load(“:/i18n/” + baseName)) {
a.installTranslator(&translator);
break;
}
}
DataComm w;
w.show();
return a.exec();
}


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

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

相关文章

在react中 使用redux

1.安装redux npm install reduxjs/toolkit react-redux 2.创建切片模块化数据 在Src目录下创建store目录&#xff0c;创建moude目录 创建tab.js import { createSlice } from reduxjs/toolkit; const tabSlice createSlice({name: tab,initialState: {Collapse: false,},re…

C# WinForm 中 DataGridView 实现单元格cell 能进编辑状态但是不能修改单元格的效果

在Windows Forms&#xff08;WinForms&#xff09;开发中&#xff0c;DataGridView 控件是一个功能强大的组件&#xff0c; 用于显示和管理表格数据。无论是展示大量数据&#xff0c;还是实现交互式的数据操作&#xff0c; DataGridView 都能提供多样的功能支持&#xff0c;比如…

CLUSTERDOWN Hash slot not served问题复现

1、一主两从 172.31.4.18:6381> cluster nodes f5e774bd5cd8f5bcba53f1297015f3245dd3f18c 172.31.4.20:638316383 master - 0 1726278342891 10 connected 5461-10922 9a79febbfb1d7a8f7a6ba3fb11e86b0f122f71e7 172.31.4.21:638616386 slave 401730ba6e1c2cd8b60243990f0…

C++设计模式(更新中)

文章目录 1、创建型模式1.1 简单工厂&#xff08;Simple Factory&#xff09;&#xff08;1&#xff09;示例&#xff08;2&#xff09;总结 1.2 工厂方法&#xff08;Factory Method&#xff09;&#xff08;1&#xff09;示例&#xff08;2&#xff09;总结 1.3 抽象工厂&…

PL/SQL程序设计入门

PL/SQL程序设计 PL/SQL起步鼻祖&#xff1a;hello World语法分析声明部分举例 应用举例 PL/SQL 起步鼻祖&#xff1a;hello World 先举个例子&#xff0c;用PL/SQL打印输出hello world declarev_string varchar2(20); beginv_string:hello world;dbms_output.put_line(v_str…

Sass实现文字两侧横线及Sass常用方案

Sass常用方案及Sass实现文字两侧横线 1.Sass实现文字两侧横线2.用Sass简化媒体查询3.使用继承占位符实现样式复用4.Sass 模块化5.lighten 和 darken 自我记录 1.Sass实现文字两侧横线 mixin 的基本作用&#xff1a; 代码复用&#xff1a;把常用的样式封装在一起&#xff0c;…

Java如何扫描指定包下所有类?

Java如何扫描指定包下所有类&#xff1f; Java8、jdk8、idea、反射、class背景 每次写算法题时&#xff0c;总觉得测试代码写起来又没营养又很麻烦&#xff0c;即便是借助junit测试框架也很麻烦&#xff0c;太重了。 正好在学习spring过程中接触到注解&#xff0c;研究其原理…

SpringCloud-04 OpenFeign服务调用与负载均衡

OpenFeign是一个声明式、模板化的HTTP客户端&#xff0c;它简化了在Java应用程序中调用RESTful API的过程。OpenFeign是Netflix开发的一个开源项目&#xff0c;它构建在Feign的基础上&#xff0c;为开发者提供了更加简单、灵活的方式来实现HTTP请求。OpenFeign的特点包括&#…

地平线秋招2025

【地平线秋招】 中秋卷起来&#xff01;&#xff01;&#xff01; 内推码 kbrfck 内推码 kbrfck 内推码 kbrfck 投递链接&#xff1a;https://wecruit.hotjob.cn/SU62d915040dcad43c775ec12c/mc/position/campus?acotycoCodekbrfck&recruitType1&isLimitShowPostScope…

深入剖析:C++类对象的内存布局与优化

深入剖析&#xff1a;C类对象的内存布局与优化 引言 在C编程中&#xff0c;理解类对象的内存布局对于优化内存使用和提高程序性能至关重要。本文将详细介绍C类对象的内存布局&#xff0c;包括数据成员、虚函数表指针以及静态变量和静态方法在内存中的位置。通过这些知识&…

【Google Chrome Windows 64 version及 WebDriver 版本】

最近升级到最新版本Chrome后发现页面居然显示错乱实在无语, 打算退回原来的版本, 又发现官方只提供最新的版本下载, 为了解决这个问题所有收集了Chrome历史版本的下载地址分享给大家. Google Chrome Windows version 64 位 VersionSize下载地址Date104.0.5112.10282.76 MBhtt…

MySQL从入门到精通二

第1章&#xff1a;MySQL基础 1.1运算符 1.1.1 算术运算符 算术运算符是MySQL中最常用的一类运算符。MySQL支持的算术运算符包括加、减、乘、除、求余。 算术运算符 符号作用符号作用加法运算%求余运算-减法运算DIV除法运算*乘法运算MOD求余运算&#xff0c;返回余数/除法运算…

Python|基于Kimi大模型,删除已上传的“指定文档”或“全部文档”(6)

前言 本文是该专栏的第6篇,后面会持续分享AI大模型干货知识,记得关注。 在本专栏上一篇《Python|基于Kimi大模型,实现上传文档并进行对话(5)》中,笔者有详细介绍“基于kimi大模型,上传指定文档并结合prompt,获取目标文本数据”。对此感兴趣的同学,可以直接点击翻阅查…

【洛谷】P3743 小鸟的设备 的题解

【洛谷】P3743 小鸟的设备 的题解 题目传送门 题解 水一道二分 qaq 刚开始考虑的是动态规划&#xff0c;但是动态规划并不能维护题目所要求的东西。所以我们将思路转向另一种求最值问题的方法&#xff1a;二分答案。 首先&#xff0c;如果一个设备在 t t t 的时间内消耗的…

Redis事件循环与网络通信机制详解

探索 Redis 底层设计:事件循环与网络通信机制 一、引言 Redis 作为一款高性能的内存数据库,其底层设计中的事件循环与网络通信机制起着至关重要的作用。这些机制使得 Redis 能够高效地处理大量的并发连接,快速响应客户端请求,并在不同的操作系统上实现良好的性能表现。 …

Java虚拟机:类的加载机制

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 034 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进一步完善自己对整个 Java 技术体系来充实自…

深度学习速通系列:命名实体识别

命名实体识别&#xff08;NER&#xff09;是自然语言处理&#xff08;NLP&#xff09;中的一项基础技术&#xff0c;它能够从文本中识别出具有特定意义的实体&#xff0c;如人名、地名、组织名等。NER在信息提取、问答系统、句法分析、机器翻译等领域有着广泛的应用。 NER的技…

STL相关简介

string 看到这个词&#xff0c;相信大家一定都很好奇什么是string&#xff0c;它有什么作用呢&#xff1f;今天&#xff0c;就让我们一起来了解一下关于string的简介吧~ 目录 string 1. 什么是STL 2. STL的版本 3. STL的六大组件 4. STL的重要性 5. 如何学习STL 6.STL的…

Unity实战案例全解析 :PVZ 植物脚本分析

植物都继承了Pants脚本&#xff0c;但是我因为没注意听讲&#xff0c;把Pants也挂在植物上了&#xff0c;所以子类的PlantEnableUpdate和PlantDisableUpdate抢不过父类&#xff0c;无法正确触发动画&#xff0c;我还找不到哪里出了问题&#xff0c;所以就使用了携程加while强行…

【裸机装机系列】3.kali(ubuntu)-更新sources.list并重启

当装机并重启计算机后&#xff0c;暂时还不能使用&#xff0c;需要更新源并下载软件 1、更新软件源 1> 切换root使用命令 sudo su root 进入界面后&#xff0c;是你自己的账户&#xff0c;不是root账户&#xff0c;这里的操作是需要进入root账户进行操作的&#xff0c;否…