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")); // 发送示例数据
}