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