RYMCU

Qt5串口调试助手(3)--串口参数设置

Hugh 3 年前
# 串口调试助手

1.串口参数设置界面

参数设置界面如下图所示,包括串口号、波特率、数据位、停止位、校验位以及打开串口按钮。

串口设置 1.png

功能需求如下,当点击"打开串口"按钮后,如果正常打开,则将按钮内容更改为“关闭串口”,相应的控件设置为不可编辑状态,如下图所示。

串口设置 2.png

如果串口打开失败,则显示错误提示对话框。

错误信息.png

2.代码如下

2.1 添加串口支持

项目中用到了串口,需添加在工程文件.pro 添加:

QT       += core gui serialport

添加串口支持.png

项目头文件 mainwindow.h 中增加串口相关头文件:

#include <QSerialPort>
#include <QSerialPortInfo>

串口头文件.png

2.2 扫描串口号

软件启动时自动扫描计算机串口号,并将其写入串口号下拉框中!在 mainwindow.cpp 窗口构造函数中编写如下:

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

    //新建串口列表
   QStringList ComPort;
    // 自动扫描当前可用串口,返回值追加到字符数组中
        foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
       {
            ComPort << info.portName();
        }
       // 可用串口号,显示到串口选择下拉框中
        ui->comboBoxNo->addItems(ComPort);
}

运行结果如下,正确的获取了计算机串口号:

获取串口号.png

注意:正确显示的前提条件为计算机有串口。

2.3 波特率、数据位、停止位、校验位下拉框设置

上面几个的设置方法一样,我们以波特率下拉框设置为例进行讲解,其他自行设计。设置方法如下:

下拉框内容添加.png

2.4 “打开串口”按钮功能设计

step1:在 mainwindow.h 中添加项目中唯一的串口对象:MyCom

private:
    Ui::MainWindow *ui;

    //添加自定义变量
    QSerialPort MyCom;//串口对象,项目中唯一的串口对象

step2:转到“打开串口”槽函数,开始编写功能代码

打开串口槽函数.png

step3:编写槽函数代码,功能为获取串口设置下拉框的内容,并且打开串口,打开错误则显示错误信息。详细代码如下:

/***********************************************************
 *打开或关闭串口按钮槽函数
 * 1.从控件获取串口初始化信息包括:
 *  1.1 波特率、数据位、停止位、校验方式,端口号
 * 2.初始化串口
 * 3.打开串口
 *  3.1 打开成功,将按钮文字设置为“关闭串口”
 *  3.2 打开失败,弹出错误消息框
 *  3.3 处理相应控件
 * 4.关闭串口
 *  4.1 将按钮文字设置为“打开串口”
 *  4.2 处理相应控件
 ***********************************************************/
void MainWindow::on_pushButtonOpen_clicked()
{
    QSerialPort::BaudRate CombaudRate;
    QSerialPort::DataBits ComdataBits;
    QSerialPort::StopBits ComstopBits;
    QSerialPort::Parity   ComParity;

    //获取波特率
    if(ui->comboBoxComBaud->currentText()=="1200")
    {
        CombaudRate = QSerialPort::Baud1200;
    }
    else if(ui->comboBoxComBaud->currentText()=="2400")
    {
        CombaudRate = QSerialPort::Baud2400;
    }
    else if(ui->comboBoxComBaud->currentText()=="4800")
    {
        CombaudRate = QSerialPort::Baud4800;
    }
    else if(ui->comboBoxComBaud->currentText()=="9600")
    {
        CombaudRate = QSerialPort::Baud9600;
    }
    else if(ui->comboBoxComBaud->currentText()=="19200")
    {
        CombaudRate = QSerialPort::Baud19200;
    }
    else if(ui->comboBoxComBaud->currentText()=="38400")
    {
        CombaudRate = QSerialPort::Baud38400;
    }
    else if(ui->comboBoxComBaud->currentText()=="57600")
    {
        CombaudRate = QSerialPort::Baud57600;
    }
    else if(ui->comboBoxComBaud->currentText()=="115200")
    {
        CombaudRate = QSerialPort::Baud115200;
    }
    else
    {
        CombaudRate = QSerialPort::UnknownBaud;
    }

    //获取数据位
    if(ui->comboBoxData->currentText()=="5")
    {
        ComdataBits = QSerialPort::Data5;
    }
    else if(ui->comboBoxData->currentText()=="6")
    {
        ComdataBits = QSerialPort::Data6;
    }
    else if(ui->comboBoxData->currentText()=="7")
    {
        ComdataBits = QSerialPort::Data7;
    }
    else if(ui->comboBoxData->currentText()=="8")
    {
        ComdataBits = QSerialPort::Data8;
    }
    else
    {
        ComdataBits = QSerialPort::UnknownDataBits;
    }

    //获取停止位
    if(ui->comboBoxStop->currentText()=="1")
    {
        ComstopBits = QSerialPort::OneStop;
    }
    else if(ui->comboBoxStop->currentText()=="1.5")
    {
        ComstopBits = QSerialPort::OneAndHalfStop;
    }
    if(ui->comboBoxStop->currentText()=="2")
    {
        ComstopBits = QSerialPort::TwoStop;
    }
    else
    {
        ComstopBits = QSerialPort::UnknownStopBits;
    }

    //获取校验方式
    if(ui->comboBoxCheck->currentText()=="None")
    {
        ComParity = QSerialPort::NoParity;
    }
    else if(ui->comboBoxCheck->currentText()=="Even")
    {
        ComParity = QSerialPort::EvenParity;
    }
    else if(ui->comboBoxCheck->currentText()=="Odd")
    {
        ComParity = QSerialPort::OddParity;
    }
    else if(ui->comboBoxCheck->currentText()=="Space")
    {
        ComParity = QSerialPort::SpaceParity;
    }
    else if(ui->comboBoxCheck->currentText()=="Mark")
    {
        ComParity = QSerialPort::MarkParity;
    }
    else
    {
        ComParity = QSerialPort::UnknownParity;
    }

    //获取端口号
    QString spTxt = ui->comboBoxNo->currentText();
    spTxt = spTxt.section(':', 0, 0);//过滤掉:后面的信息,只留下COMx

    //初始化串口:设置端口号,波特率,数据位,停止位,校验方式等
    MyCom.setBaudRate(CombaudRate);
    MyCom.setDataBits(ComdataBits);
    MyCom.setStopBits(ComstopBits);
    MyCom.setParity(ComParity);
    MyCom.setPortName(spTxt);   //MyCom.setPortName(ui->comboBoxNo->currentText());

    //打开串口
    if(ui->pushButtonOpen->text() == "打开串口")
    {
        bool ComFlag;
        ComFlag = MyCom.open(QIODevice::ReadWrite);
        if(ComFlag == true)//串口打开成功
        {
            //串口下拉框设置为不可选
            ui->comboBoxCheck->setEnabled(false);
            ui->comboBoxComBaud->setEnabled(false);
            ui->comboBoxData->setEnabled(false);
            ui->comboBoxNo->setEnabled(false);
            ui->comboBoxStop->setEnabled(false);

            //使能相应按钮等
            ui->pushButtonSend->setEnabled(true);
            ui->checkBoxPeriodicSend->setEnabled(true);
            ui->checkBoxPeriodicMutiSend->setEnabled(true);
            ui->lineEditTime->setEnabled(true);
            ui->checkBoxAddNewShift->setEnabled(true);
            ui->checkBoxSendHex->setEnabled(true);

            ui->pushButtonOpen->setText("关闭串口");
        }
        else //打开失败,弹出窗口提示!
        {
           QMessageBox::critical(this, "错误提示", "串口打开失败,该端口可能被占用或不存在!rnLinux系统可能为当前用户无串口访问权限!");
        }
    }
    else
    {
       MyCom.close();

        ui->pushButtonOpen->setText("打开串口");
        ui->comboBoxCheck->setEnabled(true);
        ui->comboBoxComBaud->setEnabled(true);
        ui->comboBoxData->setEnabled(true);
        ui->comboBoxNo->setEnabled(true);
        ui->comboBoxStop->setEnabled(true);

        //使相应的按钮不可用
        ui->pushButtonSend->setEnabled(false);
        ui->checkBoxPeriodicSend->setChecked(false);//取消选中
        ui->checkBoxPeriodicSend->setEnabled(false);
        ui->checkBoxPeriodicMutiSend->setChecked(false);//取消选中
        ui->checkBoxPeriodicMutiSend->setEnabled(false);
        ui->lineEditTime->setEnabled(false);
        ui->checkBoxAddNewShift->setEnabled(false);
        ui->checkBoxSendHex->setEnabled(false);
    }
}

3.小结

完成串口设置界面设计。

后发布评论