用Qt写串口调试助手(一):串口设置

	最近学了一下qt,想着用一用吧,正好研究方向也会用到串口调试助手,那就
自己看看能不能写一个吧,仅以此篇记录一下自己学习的过程。
	首先了解一下我想实现的具体框架。

串口调试助手整体框架

	大概我想要实现的就是左边的功能。
	主要分为3个部分,从上到下依次为串口设置,接收区设置和发送区设置。当然还有许多需
要完善的地方,但这并不是自己主要的研究方向,如有什么不对的地方,还请勿喷(宇宙免责
声明)。
	进入正题,首先看一下代码的整体框架。
class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

private:
    Ui::Widget *ui;

//自己定义的函数
public:
    //载入用户上次设置
    void mLoadSet();

    //设置样式表
    void mSetQSS();

    //串口设置
    void mQSerialPortSet();

    //接收设置
    void mReceiveSet();

    //发送设置
    void mSendSet();

    //重写closeEvent方法,用于保存用户选择
    void closeEvent(QCloseEvent *event) override;
	这是在widget.h中自己定义的一些方法,载入用户设置,是用于记录用户的上次选择的,
以便本次运行时能够保持用户上次的选择,样式表设置纯属为了见面稍微美观一些,对于
串口调试助手功能来说,并没有什么卵用了,之后每一个方法正好对应框架当中的三个部分
这次主要记录一下第一部分,也就是串口设置部分
//自己定义的属性
private:
    QSerialPort mSerialPort;
    bool isOpen = false;            //串口是否打开状态变量,默认为关闭
    
	QByteArray receivePrimaryData;  //存放接收到的原始数据数据

    bool recDisplayIsPause = false; //判断接收显示是否暂停标志位, 默认显示

    QFile recFile;                  //接收到文件对象
    bool isRecToFile = false;       //是否接收到文件标志位,默认不接收到文件

    QByteArray sendPrimaryData;     //存放需要发送的原始数据
    QByteArray sendTemporaryData;   //需要处理的发送数据
    bool isSendcycle = false;       //是否循环发送标志位,默认不循环发送
    QTimer cycTimer;                //循环发送定时器
    bool isStopSend = false;        //是否是停止发送标志位

    HexOnlyEventFilter hexOnlyEventFilter;  //事件过滤器,只允许输入16进制数,空格,回车,退格
	这是在头文件中定义的一些属性,串口设置仅用到了:
	QSerialPort mSerialPort;
    bool isOpen = false;            //串口是否打开状态变量,默认为关闭
	这两个属性,mSerialPort是一个Qt当中的串口对象,我们可以通过这个对象对串口
进行设置。isOpen是用来记录串口是否打开的标志位。
	之后在源文件中实现mQSerialPortset方法:
	串口设置主要分为以下几个部分:
	1. 首先我们要获取可用串口号:
	//获取可用串口号
    QList<QSerialPortInfo> serialPorts = QSerialPortInfo::availablePorts();
    //添加到ui界面
    for(int i = 0; i < serialPorts.size(); i++){
        ui->cB_serialNum->addItem(serialPorts[i].portName());
    }
	首先定义一个QList容器,该容器存放的是QSerialPortInfo,也就是获取到的串口信息,
再调用QSerialPortInfo::availablePorts();方法获取串口信息,之后通过一个for循环
将获取到的可用串口名添加到Qt中的QComboBox中,也就是这里:

串口号

	2.读取串口参数进行参数设置
当我们点击打开按钮时,会读取用户选择的串口参数,再对串口进行设置,因此我们首先要
将打开按钮的点击信号和槽函数链接起来:
	//链接打开按钮,并读取ui界面参数设置
    connect(ui->pB_open, &QPushButton::clicked, this, [&](){
	之后再依次读取QComboBox的参数,并且对串口进行设置:

在这里插入图片描述

		//如果串口关闭,将其打开
        if(isOpen == false)
        {
            mSerialPort.setPortName(ui->cB_serialNum->currentText());   //设置串口号

            //设置波特率
            if(ui->cB_baudRate->currentText() == "9600"){
                mSerialPort.setBaudRate(QSerialPort::Baud9600);
            }
            else if(ui->cB_baudRate->currentText() == "115200")
            {
                mSerialPort.setBaudRate(QSerialPort::Baud115200);
            }

            //设置数据位
            if(ui->cB_dataBits->currentText() == "8")
            {
                mSerialPort.setBaudRate(QSerialPort::Data8);
            }

            //设置奇偶校验
            if(ui->cB_parity->currentText() == "NONE")
            {
                mSerialPort.setParity(QSerialPort::NoParity);
            }
            else if(ui->cB_parity->currentText() == "ODD")
            {
                mSerialPort.setParity(QSerialPort::OddParity);
            }
            else if(ui->cB_parity->currentText() == "EVEN")
            {
                mSerialPort.setParity(QSerialPort::EvenParity);
            }

            //设置停止位
            if(ui->cB_stopBits->currentText() == "1")
            {
                mSerialPort.setStopBits(QSerialPort::OneStop);
            }
            else if(ui->cB_stopBits->currentText() == "1.5")
            {
                mSerialPort.setStopBits(QSerialPort::OneAndHalfStop);
            }
            else if(ui->cB_stopBits->currentText() == "2")
            {
                mSerialPort.setStopBits(QSerialPort::TwoStop);
            }

            // 设置流控制
            mSerialPort.setFlowControl(QSerialPort::NoFlowControl);
	3.打开串口,并且对QComboBox设置为不使能,以保证串口打开状态下不能修改参数,
如果窗口已经是打开状态下点击按钮,那么关闭串口,并设置使能.
			//打开串口(读写方式)
            if(mSerialPort.open(QIODevice::ReadWrite))
            {
                qDebug() << "Serial port opened successfully.";

                //将ui参数设置为不使能
                ui->cB_serialNum->setEnabled(false);
                ui->cB_baudRate->setEnabled(false);
                ui->cB_dataBits->setEnabled(false);
                ui->cB_parity->setEnabled(false);
                ui->cB_stopBits->setEnabled(false);

                //将打开按钮设置为关闭按钮
                ui->pB_open->setText("关闭");

                //改变串口状态为打开
                isOpen = true;
            }
            else
            {
                qDebug() << "Failed to open serial port.";
            }
        }
        //如果此时串口打开,将其关闭
        else if(isOpen == true)
        {
            //关闭串口
            mSerialPort.close();

            //设置参数设置为使能
            ui->cB_serialNum->setEnabled(true);
            ui->cB_baudRate->setEnabled(true);
            ui->cB_dataBits->setEnabled(true);
            ui->cB_parity->setEnabled(true);
            ui->cB_stopBits->setEnabled(true);

            //设置按钮为打开
            ui->pB_open->setText("打开");

            //改变串口为关闭状态
            isOpen = false;
        }
完整串口设置代码如下:	
//串口参数设置
void Widget::mQSerialPortSet()
{
    //获取可用串口号
    QList<QSerialPortInfo> serialPorts = QSerialPortInfo::availablePorts();
    //添加到ui界面
    for(int i = 0; i < serialPorts.size(); i++){
        ui->cB_serialNum->addItem(serialPorts[i].portName());
    }

    //链接打开按钮,并读取ui界面参数设置
    connect(ui->pB_open, &QPushButton::clicked, this, [&](){

        //如果串口关闭,将其打开
        if(isOpen == false)
        {
            mSerialPort.setPortName(ui->cB_serialNum->currentText());   //设置串口号

            //设置波特率
            if(ui->cB_baudRate->currentText() == "9600"){
                mSerialPort.setBaudRate(QSerialPort::Baud9600);
            }
            else if(ui->cB_baudRate->currentText() == "115200")
            {
                mSerialPort.setBaudRate(QSerialPort::Baud115200);
            }

            //设置数据位
            if(ui->cB_dataBits->currentText() == "8")
            {
                mSerialPort.setBaudRate(QSerialPort::Data8);
            }

            //设置奇偶校验
            if(ui->cB_parity->currentText() == "NONE")
            {
                mSerialPort.setParity(QSerialPort::NoParity);
            }
            else if(ui->cB_parity->currentText() == "ODD")
            {
                mSerialPort.setParity(QSerialPort::OddParity);
            }
            else if(ui->cB_parity->currentText() == "EVEN")
            {
                mSerialPort.setParity(QSerialPort::EvenParity);
            }

            //设置停止位
            if(ui->cB_stopBits->currentText() == "1")
            {
                mSerialPort.setStopBits(QSerialPort::OneStop);
            }
            else if(ui->cB_stopBits->currentText() == "1.5")
            {
                mSerialPort.setStopBits(QSerialPort::OneAndHalfStop);
            }
            else if(ui->cB_stopBits->currentText() == "2")
            {
                mSerialPort.setStopBits(QSerialPort::TwoStop);
            }

            // 设置流控制
            mSerialPort.setFlowControl(QSerialPort::NoFlowControl);

            //打开串口(读写方式)
            if(mSerialPort.open(QIODevice::ReadWrite))
            {
                qDebug() << "Serial port opened successfully.";

                //将ui参数设置为不使能
                ui->cB_serialNum->setEnabled(false);
                ui->cB_baudRate->setEnabled(false);
                ui->cB_dataBits->setEnabled(false);
                ui->cB_parity->setEnabled(false);
                ui->cB_stopBits->setEnabled(false);

                //将打开按钮设置为关闭按钮
                ui->pB_open->setText("关闭");

                //改变串口状态为打开
                isOpen = true;
            }
            else
            {
                qDebug() << "Failed to open serial port.";
            }
        }
        //如果此时串口打开,将其关闭
        else if(isOpen == true)
        {
            //关闭串口
            mSerialPort.close();

            //设置参数设置为使能
            ui->cB_serialNum->setEnabled(true);
            ui->cB_baudRate->setEnabled(true);
            ui->cB_dataBits->setEnabled(true);
            ui->cB_parity->setEnabled(true);
            ui->cB_stopBits->setEnabled(true);

            //设置按钮为打开
            ui->pB_open->setText("打开");

            //改变串口为关闭状态
            isOpen = false;
        }

    });
}
最后的效果就是:
默认串口关闭状态下是这样的:

在这里插入图片描述

点击打开按钮串口打开状态下是这样的:

在这里插入图片描述

至此,串口设置部分就结束了,写不动了,其他的部分之后再记录吧。
  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值