Qt系列之串口编程(代码篇)

Qt 提供了 QSerialPort 类来处理串口通信。以下是一个简单的示例,演示如何使用 Qt 进行串口编程。

1. 安装 Qt 和配置项目

确保你已经安装了 Qt 开发环境。创建一个新的 Qt Widgets 应用程序项目。

2. 添加 QSerialPort 模块

在你的 .pro 文件中添加 serialport 模块:

QT += serialport

3. 创建串口通信类

创建一个新的类来处理串口通信。例如,创建一个名为 SerialPortManager 的类。

serialportmanager.h
#ifndef SERIALPORTMANAGER_H
#define SERIALPORTMANAGER_H

#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>

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

    void openSerialPort(const QString &portName, int baudRate = QSerialPort::Baud9600);
    void closeSerialPort();
    void writeData(const QByteArray &data);

signals:
    void dataReceived(const QByteArray &data);

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

private:
    QSerialPort *m_serialPort;
};

#endif // SERIALPORTMANAGER_H
serialportmanager.cpp
#include "serialportmanager.h"
#include <QDebug>

SerialPortManager::SerialPortManager(QObject *parent)
    : QObject(parent),
      m_serialPort(new QSerialPort(this))
{
    connect(m_serialPort, &QSerialPort::readyRead, this, &SerialPortManager::handleReadyRead);
    connect(m_serialPort, QOverload<QSerialPort::SerialPortError>::of(&QSerialPort::error),
            this, &SerialPortManager::handleError);
}

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

void SerialPortManager::openSerialPort(const QString &portName, int baudRate)
{
    m_serialPort->setPortName(portName);
    m_serialPort->setBaudRate(baudRate);
    m_serialPort->setDataBits(QSerialPort::Data8);
    m_serialPort->setParity(QSerialPort::NoParity);
    m_serialPort->setStopBits(QSerialPort::OneStop);
    m_serialPort->setFlowControl(QSerialPort::NoFlowControl);

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

void SerialPortManager::closeSerialPort()
{
    if (m_serialPort->isOpen()) {
        m_serialPort->close();
        qDebug() << "Serial port closed.";
    }
}

void SerialPortManager::writeData(const QByteArray &data)
{
    if (m_serialPort->isOpen()) {
        m_serialPort->write(data);
    } else {
        qDebug() << "Serial port is not open.";
    }
}

void SerialPortManager::handleReadyRead()
{
    QByteArray data = m_serialPort->readAll();
    emit dataReceived(data);
}

void SerialPortManager::handleError(QSerialPort::SerialPortError error)
{
    if (error != QSerialPort::NoError) {
        qDebug() << "Serial port error:" << m_serialPort->errorString();
    }
}

4. 在主窗口中使用 SerialPortManager

在你的主窗口类中使用 SerialPortManager 进行串口通信。

mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "serialportmanager.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_connectButton_clicked();
    void on_sendButton_clicked();
    void onDataReceived(const QByteArray &data);

private:
    Ui::MainWindow *ui;
    SerialPortManager *m_serialPortManager;
};

#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , m_serialPortManager(new SerialPortManager(this))
{
    ui->setupUi(this);

    connect(m_serialPortManager, &SerialPortManager::dataReceived, this, &MainWindow::onDataReceived);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_connectButton_clicked()
{
    QString portName = ui->portNameLineEdit->text();
    int baudRate = ui->baudRateLineEdit->text().toInt();
    m_serialPortManager->openSerialPort(portName, baudRate);
}

void MainWindow::on_sendButton_clicked()
{
    QString data = ui->sendLineEdit->text();
    m_serialPortManager->writeData(data.toUtf8());
}

void MainWindow::onDataReceived(const QByteArray &data)
{
    ui->receiveTextEdit->append(QString::fromUtf8(data));
}

5. 设计主窗口界面

使用 Qt Designer 设计主窗口界面,添加以下控件:

  • QLineEdit 用于输入端口名 (portNameLineEdit)
  • QLineEdit 用于输入波特率 (baudRateLineEdit)
  • QPushButton 用于连接串口 (connectButton)
  • QLineEdit 用于输入要发送的数据 (sendLineEdit)
  • QPushButton 用于发送数据 (sendButton)
  • QTextEdit 用于显示接收到的数据 (receiveTextEdit)

6. 运行程序

编译并运行程序,输入端口名和波特率,点击连接按钮打开串口。然后可以在发送框中输入数据并发送,接收到的数据会显示在接收框中。

这个示例展示了如何使用 Qt 进行基本的串口通信。你可以根据需要扩展和修改这个示例,以满足更复杂的需求。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

飘飘燃雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值