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

QT------------------串口编程

实现思路

  1. QT Serial Port 模块概述
    • QT Serial Port 模块提供了 QSerialPortInfoQSerialPort 类,用于串口通信。
    • QSerialPortInfo 用于获取串口设备的信息,如名称、描述、制造商等。
    • QSerialPort 用于打开、关闭、读写串口数据。
  2. 自定义标签类 TMYLabel 设计和使用
    • 创建一个自定义的标签类 TMYLabel ,可以根据需要添加一些自定义的属性和方法。
  3. 主窗口类定义和初始化
    • 设计主窗口类,包含串口操作的相关控件,如打开、关闭、发送、接收等按钮,以及显示接收数据的控件。
  4. 通过串口读写数据
    • 使用 QSerialPort 类进行串口的读写操作,处理数据的接收和发送。

代码示例

1. 自定义标签类 TMYLabel
#include <QtWidgets/QWidget>
#include <QtWidgets/QLabel>


class TMYLabel : public QLabel {
    Q_OBJECT
public:
    TMYLabel(QWidget *parent = nullptr) : QLabel(parent) {
        // 可以在这里添加自定义的初始化代码
    }


    // 可以添加自定义的方法和属性
    void setCustomText(const QString &text) {
        setText(text);
    }


signals:
    // 可以添加自定义的信号
    void customClicked();


protected:
    void mousePressEvent(QMouseEvent *event) override {
        emit customClicked();
        QLabel::mousePressEvent(event);
    }
};
2. 主窗口类定义和初始化,串口编程示例
#include <QtWidgets/QApplication>
#include <QtWidgets/QMainWindow>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QTextEdit>
#include <QtWidgets/QComboBox>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QtCore/QDebug>


class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {
        setWindowTitle("Serial Port Example");


        QWidget *centralWidget = new QWidget(this);
        QVBoxLayout *layout = new QVBoxLayout(centralWidget);


        // 串口选择下拉菜单
        QComboBox *portComboBox = new QComboBox();
        const auto infos = QSerialPortInfo::availablePorts();
        for (const QSerialPortInfo &info : infos) {
            portComboBox->addItem(info.portName());
        }
        layout->addWidget(portComboBox);


        // 打开串口按钮
        QPushButton *openButton = new QPushButton("Open Serial Port");
        connect(openButton, &QPushButton::clicked, this, &MainWindow::openSerialPort);
        layout->addWidget(openButton);


        // 关闭串口按钮
        QPushButton *closeButton = new QPushButton("Close Serial Port");
        connect(closeButton, &QPushButton::clicked, this, &MainWindow::closeSerialPort);
        layout->addWidget(closeButton);


        // 发送数据按钮
        QPushButton *sendButton = new QPushButton("Send Data");
        connect(sendButton, &QPushButton::clicked, this, &MainWindow::sendData);
        layout->addWidget(sendButton);


        // 接收数据显示区域
        QTextEdit *receiveTextEdit = new QTextEdit();
        receiveTextEdit->setReadOnly(true);
        layout->addWidget(receiveTextEdit);


        setCentralWidget(centralWidget);


        serialPort = new QSerialPort(this);
        connect(serialPort, &QSerialPort::readyRead, this, &MainWindow::readData);


        receiveTextEdit_ = receiveTextEdit;
        portComboBox_ = portComboBox;
    }


private slots:
    void openSerialPort() {
        if (serialPort->isOpen()) {
            serialPort->close();
        }


        QString portName = portComboBox_->currentText();
        serialPort->setPortName(portName);
        serialPort->setBaudRate(QSerialPort::Baud9600);
        serialPort->setDataBits(QSerialPort::Data8);
        serialPort->setParity(QSerialPort::NoParity);
        serialPort->setStopBits(QSerialPort::OneStop);
        serialPort->setFlowControl(QSerialPort::NoFlowControl);


        if (serialPort->open(QIODevice::ReadWrite)) {
            qDebug() << "Serial port opened successfully";
        } else {
            qDebug() << "Failed to open serial port:" << serialPort->errorString();
        }
    }


    void closeSerialPort() {
        if (serialPort->isOpen()) {
            serialPort->close();
            qDebug() << "Serial port closed";
        }
    }


    void sendData() {
        if (serialPort->isOpen()) {
            QByteArray data = "Hello from QT!";
            serialPort->write(data);
        } else {
            qDebug() << "Serial port is not open";
        }
    }


    void readData() {
        QByteArray data = serialPort->readAll();
        receiveTextEdit_->append(data);
    }


private:
    QSerialPort *serialPort;
    QComboBox *portComboBox_;
    QTextEdit *receiveTextEdit_;
};


int main(int argc, char *argv[]) {
    QApplication app(argc, argv);


    MainWindow mainWindow;
    mainWindow.show();


    return app.exec();
}


#include "main.moc"

代码解释

1. 自定义标签类 TMYLabel
  • TMYLabel 类
    • 继承自 QLabel,可以添加自定义的方法,如 setCustomText 用于设置标签文本。
    • 重写 mousePressEvent 并发出自定义信号 customClicked,可用于处理鼠标点击事件。
2. 主窗口类 MainWindow
  • 构造函数

    • 创建界面元素,包括串口选择下拉菜单、打开/关闭串口按钮、发送数据按钮和接收数据显示区域。
    • 使用 QSerialPortInfo::availablePorts() 获取可用串口信息并添加到下拉菜单。
    • 连接按钮点击信号到相应的槽函数。
  • openSerialPort 槽函数

    • 配置串口参数,如波特率、数据位、校验位、停止位和流控制。
    • 尝试打开串口,根据结果输出相应信息。
  • closeSerialPort 槽函数

    • 关闭已打开的串口。
  • sendData 槽函数

    • 向串口发送数据,这里发送了一个简单的字符串。
  • readData 槽函数

    • 当串口有数据可读时,使用 readAll 读取数据并添加到 QTextEdit 中显示。

在这里插入图片描述

使用说明

  1. 将上述代码保存为 main.cpp 文件。
  2. .pro 文件中添加以下内容:
QT += serialport widgets
CONFIG += c++11
  1. 编译并运行程序。
    • 选择一个可用的串口。
    • 点击 “Open Serial Port” 打开串口。
    • 点击 “Send Data” 发送数据。
    • 接收的数据将显示在 QTextEdit 中。

与 ESP8266 模块的通信程序

  • 上述代码可用于与 ESP8266 模块通信。
  • 确保 ESP8266 模块连接到计算机的串口并已正确配置,例如设置波特率为 9600。
  • 可以修改 sendData 方法发送特定的 AT 命令,例如 serialPort->write("AT\r\n"); 发送 AT 命令给 ESP8266。

http://www.kler.cn/a/466198.html

相关文章:

  • KAGGLE竞赛实战2-捷信金融违约预测竞赛-part1-数据探索及baseline建立
  • Fabric部署-docker安装
  • memcached的基本使用
  • ABAP 两个内表不同名称字段赋值的方法
  • VB.NET CRC32 校验
  • 中高级运维工程师运维面试题(十一)之 Docker
  • 计算机网络 (21)网络层的几个重要概念
  • 【机器学习:一、机器学习简介】
  • 首都旅游逐绿焕新!苏州金龙新V系客车助推北京旅游客运加速转型
  • Wonder Dynamics技术浅析(七):细节优化
  • 《庐山派K230 从入熟悉到...》获取图像,获取一张照片
  • 使用Python实现患者数据分析:探索健康管理的新路径
  • Fabric环境部署
  • 二、CSS基础
  • 沙箱模拟支付宝支付3--支付的实现
  • 大数据系列之:深入理解学习使用腾讯COS和COS Ranger权限体系解决方案,从hdfs同步数据到cos
  • 第 22 章 处理 XML
  • Linux网络 | 理解Web路径 以及 实现一个简单的helloworld网页
  • Ubuntu20.04 Qt5.14.2 交叉编译RK3588 单独编译qtwebsockets模块
  • 一文读懂相关性分析法
  • PostgreSQL对称between比较运算
  • 每日一学——监控工具(Grafana)
  • C 语言:注释的重要性及用法详解
  • [unity][图形渲染]UnityShader操作基础4-CG/HLSL语义
  • a里ACP大模型模拟试题(附答案及解析)
  • 人工智能之数学基础:向量内积以及应用