QT 创建一个完整应用程序(适合初学者练习)_串口助手_代码详解

目录

串口助手ui界面的设置

.pro的配置

.h头文件配置

.cpp操作代码

动态识别串口号

串口配置(波特率,校验位,数据位,停止位)

串口打开_按钮使能控制

数据发送文本框配置

数据接收文本框配置

清楚文本框按钮配置

接收数据显示系统时间

保存Text数据到桌面txt


串口助手ui界面的设置

新人先看如果创建文件及设计界面,具体操作步骤看另一篇文章

《 QT创建程序_串口助手_界面布局

地址QT 创建第一个完整应用程序_串口助手_界面布局_daisy.skye的博客-CSDN博客_qt 串口界面

.pro的配置

代码添加serialport 为串口配置

QT += core gui serialport

.h头文件配置

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "sqlwindow.h"  //添加子窗口sqlwindow头文件

#include <QSerialPort>  //串口


namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

public:
    bool getSerialPortConfig(void);

//ui界面的PushButton按钮右键转到槽点击后自动生成
private slots:
    void on_BtnOpen_clicked();

    void on_BtnSend_clicked();

    void on_SerialPort_readyRead();

    void on_BtnClear_clicked();


private:
    Ui::MainWindow *ui;

private:

    bool mIsOpen;//增加标志位

    //生成类内成员
    QSerialPort mSerialPort;

    //设置成员变量,分别时串口名称,比特率,校验位,数据位,停止位
    QString mPortName;  
    QString mBaudRate;
    QString mParity;
    QString mDataBits;
    QString mStopBits;
};

#endif // MAINWINDOW_H

.cpp操作代码

添加头文件以及系统文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSerialPortInfo>  //串口信息(名称)
#include <QDebug>           //调试窗口(输出)

动态识别串口号

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // To do user's work

    mIsOpen = false;//设置开关变量
    ui->BtnSend->setEnabled(mIsOpen);//ui界面的发送未使能,等待串口打开成功后开启

    //动态识别当前系统的有效串口号
    QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts();//有效端口号的列表
    int count = serialPortInfo.count();//计算串口数量
    for(int i = 0 ; i < count; i++) //for循环遍历
    {
        //ui界面的下拉列表框(名称自定义的)增加项目内容为 串口索引位置的串口号名称
        ui->CboxSerialPort->addItem(serialPortInfo.at(i).portName());

    }

    //连接串口发送信号,以及接收信号的槽
    connect(&mSerialPort,SIGNAL(readyRead()),this,SLOT(on_SerialPort_readyRead()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

串口配置(串口号,波特率,校验位,数据位,停止位)

//在.h文件中鼠标选中getSerialPortConfig再键盘按住alt+enter自动生成
bool MainWindow::getSerialPortConfig()
{
    //获取串口配置
    mPortName = ui->CboxSerialPort->currentText();
    mBaudRate = ui->CboxBaurdRate->currentText();
    mParity = ui->CboxParity->currentText();
    mDataBits = ui->CboxDateBits->currentText();
    mStopBits = ui->CboxStopBits->currentText();

    //设置串口配置
    //设置端口号
    mSerialPort.setPortName(mPortName);
    //设置波特率
    if("9600" == mBaudRate)
    {
        mSerialPort.setBaudRate(QSerialPort::Baud9600);
    }
    else if("19200" == mBaudRate)
    {
        mSerialPort.setBaudRate(QSerialPort::Baud19200);
    }
    else
    {
        mSerialPort.setBaudRate(QSerialPort::Baud115200);
    }
    //设置校验位
    if("NONE" == mParity)
    {
        mSerialPort.setParity(QSerialPort::NoParity);
    }
    else if("ODD" == mParity)
    {
        mSerialPort.setParity(QSerialPort::OddParity);
    }
    else
    {
        mSerialPort.setParity(QSerialPort::EvenParity);
    }
    //设置数据位
    if("6" == mDataBits)
    {
        mSerialPort.setDataBits(QSerialPort::Data6);
    }
    else if("7" == mDataBits)
    {
        mSerialPort.setDataBits(QSerialPort::Data7);
    }
    else
    {
        mSerialPort.setDataBits(QSerialPort::Data8);
    }
    //设置停止位
    if("1.5" == mStopBits)
    {
        mSerialPort.setStopBits(QSerialPort::OneAndHalfStop);
    }
    else if("2" == mStopBits)
    {
        mSerialPort.setStopBits(QSerialPort::TwoStop);
    }
    else
    {
        mSerialPort.setStopBits(QSerialPort::OneStop);
    }

    //打开串口
    return mSerialPort.open(QSerialPort::ReadWrite);
}

串口打开_按钮使能控制

串口使能效果,当串口打开后,其串口号,波特率,校验位,数据位,停止位不能再被更改,除非关闭

//串口打开按钮
//ui界面的PushButton按钮右键转到槽点击后自动生成的函数框
void MainWindow::on_BtnOpen_clicked()
{
    if(true == mIsOpen)
    {
        //当前串口助手打开后,执行关闭的动作
        mSerialPort.close();
        ui->BtnOpen->setText("打开");
        mIsOpen = false;

        ui->CboxSerialPort->setEnabled(true);
        ui->CboxBaurdRate->setEnabled(true);
        ui->CboxParity->setEnabled(true);
        ui->CboxDateBits->setEnabled(true);
        ui->CboxStopBits->setEnabled(true);
    }
    else
    {
        //当前串口助手没有打开串口,执行打开串口的动作
        if(true == getSerialPortConfig())
        {
            mIsOpen = true;
            ui->BtnOpen->setText("关闭");
            qDebug() << "成功打开串口" << mPortName;

            ui->BtnSend->setEnabled(mIsOpen);//串口成功打开,ui界面的发送button使能
            ui->CboxSerialPort->setEnabled(false);
            ui->CboxBaurdRate->setEnabled(false);
            ui->CboxParity->setEnabled(false);
            ui->CboxDateBits->setEnabled(false);
            ui->CboxStopBits->setEnabled(false);
        }
//        else
//        {
//            mIsOpen = false;
//        }
    }
}

数据发送文本框配置

//发送文本框
//ui界面的PushButton按钮右键转到槽点击后自动生成的槽函数
void MainWindow::on_BtnSend_clicked()
{
    if(true == mIsOpen)
    {
        //串口写入 ui发送文本框设置返回文本(QString类型),转换成标准C++String再转换成char*字符串指针,中文不支持
        // mSerialPort.write(ui->TextSend->toPlainText().toStdString().c_str());

        //更换成toPlainText().toLocal8Bit()既可以发送字符,数字,也可以发送中文
        mSerialPort.write(ui->TextSend->toPlainText().toLocal8Bit());
    }
}

数据接收文本框配置

//接收文本框
//在.h文件中子定义on_SerialPort_readyRead,鼠标选择键盘按住alt+enter自动生成槽函数
void MainWindow::on_SerialPort_readyRead()
{
    if(true == mIsOpen)
    {
        QString sysTime;//定义系统时间变量
        //接收槽 接收到信号内容并设置给ui界面的文本框
        QByteArray recvData = mSerialPort.readAll();
        QString Data = QString::fromLocal8Bit(recvData);//转换格式QString::fromLocal8Bit可以显示中文
        //setPlainText()只能显示一次 insertPlainText()多次显示不换行 append()多次显示且换行
        sysTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss\n");//换行使用\n即可
        ui->TextReceive->append(sysTime + QString("接收: " + Data));//接收文本框显示数
    }
}

清楚文本框按钮配置

//清除文本框按钮
//ui界面的清楚窗口按钮右键转到槽点击后自动生成的槽函数

void MainWindow::on_BtnClear_clicked()
{
      ui->TextReceive->clear();
}

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值