欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

QT创建程序_串口助手_代码详解

程序员文章站 2022-06-22 18:53:50
#ifndef MAINWINDOW_H#define MAINWINDOW_H#include #include "sqlwindow.h" //添加子窗口sqlwindow头文件#include //串口#include //系统时间#include //读写文件#include ....

目录

串口助手ui界面的设置

.pro的配置

.h头文件配置

.cpp操作代码

动态识别串口号

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

串口打开_按钮使能控制

数据发送文本框配置

数据接收文本框配置

清楚文本框按钮配置

接收数据显示系统时间

保存Text数据到桌面txt


串口助手ui界面的设置

QT创建程序_串口助手_代码详解

操作步骤请查看 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);
}

串口打开_按钮使能控制

QT创建程序_串口助手_代码详解QT创建程序_串口助手_代码详解

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

//串口打开按钮
//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();
}

 

 

本文地址:https://blog.csdn.net/qq_40715266/article/details/107982284

相关标签: Qt