天天看點

QT編寫序列槽調試助手實作序列槽通信

QT編寫序列槽調試助手實作序列槽通信

    • qt項目
QT編寫序列槽調試助手實作序列槽通信

qt項目

一、.pro檔案添加序列槽

添加子產品:

QT +=  serialport
           

二、mainwindow.h

添加頭檔案:

#include <QtSerialPort/QSerialPort>
   #include <QtSerialPort/QSerialPortInfo>
           

執行個體化類,添加槽函數:按鈕可直接轉到槽,自己定義的槽函數要在private slots聲名

private:
        QSerialPort *serial;
   private slots:
        void ReadData();
        void SendData();
        void on_pushButton_findcom_clicked();
        void on_pushButton_opencom_clicked()
           

三、mainwindow.cpp

#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);
}
           

四、mainwindow.h

#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


           

serialthread.cpp

#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();
}


           

serialthread.h

#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