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