使用qt5.14版本,检测串口插入拔出事件,并将所有串口号更新到comboBoxSerialPort中完整代码
时间: 2024-05-06 17:17:00 浏览: 97
以下是使用Qt5.14版本检测串口插入拔出事件,并将所有串口号更新到comboBoxSerialPort中的完整代码:
mainwindow.h
```c++
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
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_pushButtonRefresh_clicked();
void on_pushButtonOpen_clicked();
void on_pushButtonClose_clicked();
void readData();
void handleError(QSerialPort::SerialPortError error);
void handleSerialPortChanged(const QSerialPortInfo &info);
private:
Ui::MainWindow *ui;
QSerialPort *serialPort;
};
#endif // MAINWINDOW_H
```
mainwindow.cpp
```c++
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 初始化串口
serialPort = new QSerialPort(this);
connect(serialPort, &QSerialPort::readyRead, this, &MainWindow::readData);
connect(serialPort, static_cast<void(QSerialPort::*)(QSerialPort::SerialPortError)>(&QSerialPort::error), this, &MainWindow::handleError);
// 更新串口列表
QList<QSerialPortInfo> portList = QSerialPortInfo::availablePorts();
for (const QSerialPortInfo &info : portList) {
ui->comboBoxSerialPort->addItem(info.portName());
}
// 监听串口插拔事件
connect(QSerialPortInfo::availablePorts(), &QSerialPortInfo::changed, this, &MainWindow::handleSerialPortChanged);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButtonRefresh_clicked()
{
// 更新串口列表
ui->comboBoxSerialPort->clear();
QList<QSerialPortInfo> portList = QSerialPortInfo::availablePorts();
for (const QSerialPortInfo &info : portList) {
ui->comboBoxSerialPort->addItem(info.portName());
}
}
void MainWindow::on_pushButtonOpen_clicked()
{
// 打开串口
if (serialPort->isOpen()) {
QMessageBox::warning(this, tr("Warning"), tr("Serial port is already open!"));
return;
}
serialPort->setPortName(ui->comboBoxSerialPort->currentText());
serialPort->setBaudRate(ui->comboBoxBaudRate->currentText().toInt());
serialPort->setDataBits(QSerialPort::Data8);
serialPort->setParity(QSerialPort::NoParity);
serialPort->setStopBits(QSerialPort::OneStop);
serialPort->setFlowControl(QSerialPort::NoFlowControl);
if (!serialPort->open(QIODevice::ReadWrite)) {
QMessageBox::warning(this, tr("Warning"), serialPort->errorString());
} else {
ui->pushButtonOpen->setEnabled(false);
ui->pushButtonClose->setEnabled(true);
}
}
void MainWindow::on_pushButtonClose_clicked()
{
// 关闭串口
if (!serialPort->isOpen()) {
QMessageBox::warning(this, tr("Warning"), tr("Serial port is not open!"));
return;
}
serialPort->close();
ui->pushButtonOpen->setEnabled(true);
ui->pushButtonClose->setEnabled(false);
}
void MainWindow::readData()
{
// 读取串口数据
QByteArray data = serialPort->readAll();
ui->textEditReceive->insertPlainText(QString(data));
}
void MainWindow::handleError(QSerialPort::SerialPortError error)
{
// 处理串口错误
if (error == QSerialPort::ResourceError) {
QMessageBox::warning(this, tr("Warning"), tr("Serial port error: %1").arg(serialPort->errorString()));
on_pushButtonClose_clicked();
}
}
void MainWindow::handleSerialPortChanged(const QSerialPortInfo &info)
{
// 处理串口插拔事件
Q_UNUSED(info);
on_pushButtonRefresh_clicked();
}
```
在界面上,需要添加以下控件:
- comboBoxSerialPort: 下拉列表框,用于显示所有可用的串口号
- comboBoxBaudRate: 下拉列表框,用于选择波特率
- pushButtonRefresh: 按钮,用于刷新可用串口列表
- pushButtonOpen: 按钮,用于打开选中的串口
- pushButtonClose: 按钮,用于关闭已打开的串口
- textEditReceive: 文本框,用于显示接收到的串口数据
需要注意的是,由于串口插拔事件的处理需要使用Qt5.9以上版本的特性,因此建议使用Qt5.14或更高版本。
阅读全文