概述
QT5写串口助手,用QT自带串口类QSerialport,所以在项目的.pro文件中加入一句 QT += serialport,并在头文件中加入#include <QSerialPort>
以下是mainwindow.h的内容
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtSerialPort/QSerialPort>
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void initMainUi();
void find_serialport();
void read_serialport();
public slots:
void on_open_serialport_clicked();
void on_close_serialport_clicked();
void refreshSerial();
void send_data();
private:
Ui::MainWindow *ui;
QSerialPort serialport; //串口类
};
#endif // MAINWINDOW_H
以下是mainwindow.cpp的内容
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
setWindowTitle(tr("串口工具"));
connect(ui->open_serialport,&QPushButton::clicked,this,&MainWindow::on_open_serialport_clicked);
connect(ui->close_serialport,&QPushButton::clicked,this,&MainWindow::on_close_serialport_clicked);
connect(ui->refresh_serialport,&QPushButton::clicked,this,&MainWindow::refreshSerial);
connect(ui->btn_send,&QPushButton::clicked,this,&MainWindow::send_data);
}
MainWindow::~MainWindow()
{
delete ui;
}
/**
* 初始化界面
*/
void MainWindow::initMainUi()
{
find_serialport();
ui->open_serialport->setEnabled(true);
ui->close_serialport->setEnabled(false);
ui->label_state->setText("串口未打开");
}
/**
* 打开串口
*/
void MainWindow::on_open_serialport_clicked()
{
if(serialport.isOpen())
{
serialport.close();
}
//先设波特率再打开串口
QString comName = ui->com->currentText();
serialport.setPortName(comName);
serialport.setBaudRate(QSerialPort::Baud115200); //波特率
serialport.setParity(QSerialPort::NoParity); //校验位
serialport.setDataBits(QSerialPort::Data8); //数据位
serialport.setStopBits(QSerialPort::OneStop); //停止位
serialport.setFlowControl(QSerialPort::NoFlowControl);
if(serialport.open(QIODevice::ReadWrite)) //打开串口成功
{
serialport.clear();
connect(&serialport, SIGNAL(readyRead()),this, SLOT(read_serialport()));
ui->close_serialport->setEnabled(true);
ui->open_serialport->setEnabled(false);
ui->label_state->setText(tr("串口打开成功"));
}
else
{
QMessageBox::information(this,tr("Error"),tr("Open the failure"),QMessageBox::Ok);
ui->label_state->setText(tr("串口未打开"));
return;
}
}
/**
* 关闭串口
*/
void MainWindow::on_close_serialport_clicked()
{
//关闭串口
serialport.clear(); //清空缓存区
serialport.close(); //关闭串口
ui->close_serialport->setEnabled(false);
ui->open_serialport->setEnabled(true);
ui->label_state->setText(tr("串口 关闭"));
}
/**
* 查找可用串口
*/
void MainWindow::find_serialport()
{
//查找可用的串口
QStringList comlist;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
//检测是否可用
if(!info.isBusy())
comlist<<info.portName();
}
if(comlist.isEmpty()){
qDebug()<<"未找到可用串口,请确认串口连接正常后点击刷新";
}
ui->com->addItems(comlist);
}
/**
* 刷新串口名列表
*/
void MainWindow::refreshSerial()
{
ui->com->clear();
QStringList comlist;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
//检测是否可用
if(!info.isBusy())
comlist<<info.portName();
}
if(comlist.isEmpty()){
qDebug()<<"未找到可用串口,请确认串口连接正常后点击刷新";
}
ui->com->addItems(comlist);
}
/**
* 读串口数据
*/
void MainWindow::read_serialport()
{
qDebug()<<"有数据进入";
QByteArray arry ;//设置缓存区
arry= serialport.readAll();
ui->rcv_box->append(arry.toHex());
}
/**
* 写串口数据
*/
void MainWindow::send_data()
{
QString senddata = ui->send_box->toPlainText();
QString data ;
bool ok;
for(int i = 0;i<senddata.length();i+=2)
{
data += senddata.mid(i,2).toInt(&ok,16);
}
serialport.write(data.toUtf8());
}
以上是最简单的串口助手,可以在此基础上增加自己想要的功能。
网上说QT自带串口类最高支持115200波特率,此次设计基于QT13.2开发,发现串口波特率可支持921600(亲测可行),如需换第三方串口类,下一篇会写。