QT初学--串口助手

概述

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(亲测可行),如需换第三方串口类,下一篇会写。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值