Qt5实现子线程读取串口数据上报至主线程

直接撸代码

#include "mainwindow.h"
#include "ui_mainwindow.h"

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

    //查找可用的串口
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
            ui->PortBox->addItem(serial.portName());
            serial.close();
        }
    }
    //设置波特率下拉菜单默认显示第一项
    ui->BaudBox->setCurrentIndex(0); // 115200
}

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

void MainWindow::on_openButton_clicked()
{
    if(ui->openButton->text()=="open")
    {
        mthread =new SerialThread(ui->PortBox->currentText(), ui->BaudBox->currentText().toInt());

        connect(mthread,SIGNAL(senddata(QByteArray)),this,SLOT(on_showData(QByteArray)),Qt::QueuedConnection);

        //接收子线程传输数据的信号

        mthread->run();//开启子线程

        //关闭设置菜单使能
        ui->PortBox->setEnabled(false);
        ui->BaudBox->setEnabled(false);

        ui->openButton->setText("close");
    }
    else
    {
        //关闭串口
        mthread->close_mthread_serial();

        //恢复设置使能
        ui->PortBox->setEnabled(true);
        ui->BaudBox->setEnabled(true);
        ui->openButton->setText("open");
    }
}

void MainWindow::on_showData(QByteArray value)
{
    ui->textEdit->append(value);
}


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QThread>
#include "serialthread.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void on_openButton_clicked();

    void on_showData(QByteArray value);

private:
    Ui::MainWindow *ui;
    QSerialPort *serial;
    SerialThread *mthread;
};

#endif // MAINWINDOW_H


#include "serialthread.h"

SerialThread::SerialThread(QString port, long baud)
{
    myport = port;
    myBaud = baud;
}


void SerialThread::run()

{
    //重写run()函数初始化串口
    serial = new QSerialPort();

    serial->setPortName(myport);

    serial->open(QIODevice::ReadWrite);//读写方式打开

    serial->setBaudRate(myBaud);//波特率

    serial->setDataBits(QSerialPort::Data8);//数据位

    serial->setParity(QSerialPort::NoParity);//奇偶校验

    serial->setStopBits(QSerialPort::OneStop);//停止位

    serial->setFlowControl(QSerialPort::NoFlowControl);//控制位

    connect(serial, SIGNAL(readyRead()), this, SLOT(read_serial_data()), Qt::QueuedConnection);//有数据就读

}

void SerialThread::read_serial_data()
{
    if(serial->bytesAvailable()>= 9)
    {
        QByteArray temp;

        temp = serial->read(9);//每串数据为9个字节

        emit senddata(temp);//发送数据给主线程

//      qDebug() << temp ;
      }
}

void SerialThread::close_mthread_serial(void)

{
    qDebug() <<"close ok"<<endl;

    serial->clear();

    serial->close();//关闭子线程

    serial->deleteLater();
}


#ifndef SERIALTHREAD_H
#define SERIALTHREAD_H

#include <QObject>
#include <QThread>
#include <QWaitCondition>
#include <QMutex>
#include <QDebug>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>


class SerialThread : public QThread
{
    Q_OBJECT

public:
    SerialThread(QString port, long baud);

    void run();


signals:

    void senddata(QByteArray data);//向主线程发送接收到的串口数据

public slots:

    void read_serial_data();//读取串口数据

    void close_mthread_serial();//关闭

private:

    QSerialPort *serial;

    QString myport;
    long myBaud;

    float data;
};

#endif // SERIALTHREAD_H


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值