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 进行基本的串口通信。你可以根据需要扩展和修改这个示例,以满足更复杂的需求。