qt重写串口类并在子线程进行串口操作

1.重写串口类

//SerialWorker.h
#pragma once
#include <QObject>
#include <QSerialPort>
#include <QThread>
#include <QDebug>

class SerialWorker : public QObject
{
    Q_OBJECT
public:
    explicit SerialWorker(QObject *parent = nullptr);
    ~SerialWorker();

public slots:
    void openPort(const QString &portName, int baudRate);
    void closePort();
    void sendData(const QByteArray &data);

signals:
    void dataReceived(const QByteArray &data);
    void errorOccurred(const QString &error);
    void portOpened(bool success);

private slots:
    void handleReadyRead();
    void handleError(QSerialPort::SerialPortError error);

private:
    QSerialPort *m_serial;
};
//SerialWorker.cpp
#include "SerialWorker.h"

SerialWorker::SerialWorker(QObject *parent) : QObject(parent)
{
    m_serial = new QSerialPort(this);
    connect(m_serial, &QSerialPort::readyRead, this, &SerialWorker::handleReadyRead);
    connect(m_serial, &QSerialPort::errorOccurred, this, &SerialWorker::handleError);
}

SerialWorker::~SerialWorker()
{
    closePort();
}

void SerialWorker::openPort(const QString &portName, int baudRate)
{
    if (m_serial->isOpen()) {
        m_serial->close();
    }

    m_serial->setPortName(portName);
    m_serial->setBaudRate(baudRate);
    m_serial->setDataBits(QSerialPort::Data8);
    m_serial->setParity(QSerialPort::NoParity);
    m_serial->setStopBits(QSerialPort::OneStop);

    bool success = m_serial->open(QIODevice::ReadWrite);
    emit portOpened(success);
}

void SerialWorker::closePort()
{
    if (m_serial->isOpen()) {
        m_serial->close();
    }
}

void SerialWorker::sendData(const QByteArray &data)
{
    if (m_serial->isOpen()) {
        m_serial->write(data);
    } else {
        emit errorOccurred("Port is not open!");
    }
}

void SerialWorker::handleReadyRead()
{
    emit dataReceived(m_serial->readAll());
}

void SerialWorker::handleError(QSerialPort::SerialPortError error)
{
    if (error != QSerialPort::NoError) {
        emit errorOccurred(m_serial->errorString());
    }
}

2.应用

//mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <SerialWorker.h>
#include "QDebug"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT
signals:  // 添加这行声明
    void openSerialPort(const QString &portName, int baudRate);
    void sendSerialData(const QByteArray &data);
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

private:
    Ui::MainWindow *ui;
    QThread *m_serialThread;
    SerialWorker *m_serialWorker;

    void handleData(const QByteArray &data);
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    // 创建线程和工作对象
      m_serialThread = new QThread(this);
      m_serialWorker = new SerialWorker();

      // 将工作对象移动到子线程
      m_serialWorker->moveToThread(m_serialThread);

      // 连接信号槽
      connect(m_serialThread, &QThread::finished, m_serialWorker, &QObject::deleteLater);
      connect(this, &MainWindow::openSerialPort, m_serialWorker, &SerialWorker::openPort);
      connect(this, &MainWindow::sendSerialData, m_serialWorker, &SerialWorker::sendData);
      connect(m_serialWorker, &SerialWorker::dataReceived, this, &MainWindow::handleData);

      // 启动线程
      m_serialThread->start();
      qDebug() << "主线程" << QThread::currentThread();

}

MainWindow::~MainWindow()
{
    m_serialThread->quit();
    m_serialThread->wait();
    delete ui;
}
// 添加数据处理槽函数
void MainWindow::handleData(const QByteArray &data)
{
    qDebug() << "处理槽函数" << QThread::currentThread();

    qDebug() << "Received data:" << data.toHex();
    // 在这里处理接收到的数据
}

void MainWindow::on_pushButton_clicked()
{
     emit openSerialPort("COM1", QSerialPort::Baud115200);  // 使用你需要的串口号和波特率
}

void MainWindow::on_pushButton_2_clicked()
{
     emit sendSerialData(QByteArray::fromHex("55AA0001"));  // 发送示例数据
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值