以下是一个简单的串口接收类的示例,使用Qt的QSerialPort类:

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QTimer>

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

signals:
    void receivedData(const QByteArray &data);

public slots:
    void openSerialPort(QString portName, int baudRate);
    void closeSerialPort();

private slots:
    void readData();

private:
    QSerialPort *m_serialPort;
    QTimer *m_timer;
};

在实现文件中:

SerialReceiver::SerialReceiver(QObject *parent)
    : QObject(parent)
    , m_serialPort(nullptr)
    , m_timer(nullptr)
{
}

SerialReceiver::~SerialReceiver()
{
    closeSerialPort();
}

void SerialReceiver::openSerialPort(QString portName, int baudRate)
{
    if (m_serialPort) {
        closeSerialPort();
    }

    m_serialPort = new QSerialPort(portName, this);
    m_serialPort->setBaudRate(baudRate);

    if (m_serialPort->open(QIODevice::ReadOnly)) {
        m_timer = new QTimer(this);
        connect(m_timer, &QTimer::timeout, this, &SerialReceiver::readData);
        m_timer->start(100); // 100ms定时读取
    } else {
        delete m_serialPort;
        m_serialPort = nullptr;
    }
}

void SerialReceiver::closeSerialPort()
{
    if (m_serialPort) {
        m_serialPort->close();
        delete m_serialPort;
        m_serialPort = nullptr;
    }

    if (m_timer) {
        m_timer->stop();
        delete m_timer;
        m_timer = nullptr;
    }
}

void SerialReceiver::readData()
{
    if (m_serialPort && m_serialPort->bytesAvailable() > 0) {
        QByteArray data = m_serialPort->readAll();
        emit receivedData(data);
    }
}

使用示例:

SerialReceiver *receiver = new SerialReceiver(this);
connect(receiver, &SerialReceiver::receivedData, this, &MyClass::onReceivedData);

receiver->openSerialPort("COM1", 9600);

void MyClass::onReceivedData(const QByteArray &data)
{
    // 处理接收到的数据
}
用qt写一个串口接收类

原文地址: https://www.cveoy.top/t/topic/qYq 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录