qt5串口阻塞写入读取,不卡界面,用c++
时间: 2023-07-16 12:14:37 浏览: 121
qt以阻塞方式读取串口数据源代码.7z
在Qt5中进行串口通信可以使用QSerialPort类。为了避免阻塞UI线程,可以使用Qt的信号和槽机制来处理串口的读写。下面是一个简单的例子:
```cpp
// 在头文件中声明QSerialPort对象和相关变量
#include <QtSerialPort/QSerialPort>
#include <QByteArray>
class SerialPort : public QObject
{
Q_OBJECT
public:
explicit SerialPort(QObject *parent = nullptr);
signals:
void dataReceived(const QByteArray& data);
public slots:
void writeData(const QByteArray& data);
void readData();
private:
QSerialPort m_serialPort;
};
// 在源文件中实现SerialPort类的相关函数
Serial::SerialPort(QObject *parent)
: QObject(parent)
{
// 设置串口参数
m_serialPort.setBaudRate(QSerialPort::Baud9600);
m_serialPort.setDataBits(QSerialPort::Data8);
m_serialPort.setParity(QSerialPort::NoParity);
m_serialPort.setStopBits(QSerialPort::OneStop);
m_serialPort.setFlowControl(QSerialPort::NoFlowControl);
// 连接信号和槽
QObject::connect(&m_serialPort, &QSerialPort::readyRead, this, &SerialPort::readData);
}
void SerialPort::writeData(const QByteArray& data)
{
// 写入数据
m_serialPort.write(data);
}
void SerialPort::readData()
{
// 读取数据
QByteArray data = m_serialPort.readAll();
// 发送信号
emit dataReceived(data);
}
```
在主窗口中,可以创建SerialPort对象,并连接其信号和槽:
```cpp
// 在主窗口的头文件中声明SerialPort对象
#include "serialport.h"
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
private slots:
void on_pushButton_clicked();
void onDataReceived(const QByteArray& data);
private:
Ui::MainWindow *ui;
SerialPort m_serialPort;
};
// 在主窗口的源文件中实现SerialPort对象的相关槽函数
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
// 连接信号和槽
QObject::connect(&m_serialPort, &SerialPort::dataReceived, this, &MainWindow::onDataReceived);
}
void MainWindow::on_pushButton_clicked()
{
// 写入数据
QByteArray data = "Hello World!";
m_serialPort.writeData(data);
}
void MainWindow::onDataReceived(const QByteArray& data)
{
// 处理接收到的数据
ui->textEdit->append(data);
}
```
在上面的例子中,当主窗口中的按钮被点击时,调用了SerialPort对象的writeData函数,将数据写入串口。当SerialPort对象接收到数据时,会发出dataReceived信号,主窗口中的onDataReceived函数会被调用,处理接收到的数据,并将其显示在UI界面上。这样就可以实现串口通信,同时不会阻塞UI线程了。
阅读全文