QT判断串口名是否为USB-SERIAL CH340自动识别连接,并自动判断是否断开,设置一个push button实现可以用于重连,请给出全部代码
时间: 2024-02-24 11:59:32 浏览: 27
好的,以下是一个完整的示例代码,包括自动识别和重连功能:
mainwindow.h:
```cpp
#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:
Ui::MainWindow *ui;
QSerialPort serialPort;
bool isCH340(const QSerialPortInfo& portInfo);
private slots:
void on_pushButton_clicked();
void onSerialPortError(QSerialPort::SerialPortError error);
void onSerialPortDataReady();
};
#endif // MAINWINDOW_H
```
mainwindow.cpp:
```cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 连接串口错误信号
connect(&serialPort, SIGNAL(error(QSerialPort::SerialPortError)), this, SLOT(onSerialPortError(QSerialPort::SerialPortError)));
// 连接串口数据可读信号
connect(&serialPort, SIGNAL(readyRead()), this, SLOT(onSerialPortDataReady()));
// 自动识别并打开串口
QList<QSerialPortInfo> portInfos = QSerialPortInfo::availablePorts();
for (const auto& portInfo : portInfos)
{
if (isCH340(portInfo))
{
serialPort.setPort(portInfo);
serialPort.open(QIODevice::ReadWrite);
break;
}
}
}
MainWindow::~MainWindow()
{
delete ui;
if (serialPort.isOpen())
{
serialPort.close();
}
}
bool MainWindow::isCH340(const QSerialPortInfo& portInfo)
{
return portInfo.portName().contains("USB-SERIAL CH340");
}
void MainWindow::on_pushButton_clicked()
{
if (serialPort.isOpen())
{
serialPort.close();
}
// 获取可用的串口信息
QList<QSerialPortInfo> portInfos = QSerialPortInfo::availablePorts();
// 遍历查找符合要求的串口
for (const auto& portInfo : portInfos)
{
if (isCH340(portInfo))
{
// 打开该串口
serialPort.setPort(portInfo);
serialPort.open(QIODevice::ReadWrite);
break;
}
}
}
void MainWindow::onSerialPortError(QSerialPort::SerialPortError error)
{
// 在这里处理串口错误,例如断开重连
if (error == QSerialPort::ResourceError)
{
if (serialPort.isOpen())
{
serialPort.close();
}
// 重新获取可用的串口信息
QList<QSerialPortInfo> portInfos = QSerialPortInfo::availablePorts();
// 遍历查找符合要求的串口
for (const auto& portInfo : portInfos)
{
if (isCH340(portInfo))
{
// 打开该串口
serialPort.setPort(portInfo);
serialPort.open(QIODevice::ReadWrite);
break;
}
}
}
}
void MainWindow::onSerialPortDataReady()
{
// 在这里处理串口数据,例如读取并显示到界面上
QByteArray data = serialPort.readAll();
ui->textEdit->insertPlainText(QString::fromUtf8(data));
}
```
注意,示例代码中使用了TextEdit控件来显示串口数据,需要在UI界面中添加TextEdit控件,并将其命名为textEdit。同时,需要在.pro文件中添加以下代码:
```
QT += serialport
```
这是为了让QT能够使用串口相关的类。