Qt - 串口调试助手UHelper

前言

前面介绍了串口类 QSerialPort 及其辅助类 QSerialPortInfo
写了综合一点的项目 - 串口调试助手
项目源码已上传到 GitHub
UI部分就不展开了,直接放张图吧
在这里插入图片描述

功能及实现

数据发送及接收均支持ASCII、Hex

其实就是数据转换,而且基本不要自己实现,Qt 已经提供了一些接口

void MainWindow::on_buttom_sendout_clicked()
{
    
    
    if(uart_state != s_connect){
    
    
        setNewsColor(Qt::red);
        ui->label_news->setText("SerialPort is't Connect.");
        return;
    }

    if(mBGsendoutmode->checkedId() == SENDOUTMODE_ASCII){
    
    
        //支持中文需使用toLocal8Bit()
        mSerial->write(ui->textEdit_output->toPlainText().toLocal8Bit().data());
    }
    else if(mBGsendoutmode->checkedId() == SENDOUTMODE_HEX){
    
    
        QByteArray bytehex = QByteArray::fromHex(
                    ui->textEdit_output->toPlainText().toLatin1()).data();
         mSerial->write(bytehex);
    }
}

void MainWindow::slot_uartReadData(){
    
    

    if(DISPLAYMODE_ASCII == mBGdisplaymode->checkedId()){
    
    

        ui->textBrowser_intput->insertPlainText(QString::fromLocal8Bit(mSerial->readAll()));

    }

    else if(DISPLAYMODE_HEX == mBGdisplaymode->checkedId()){
    
    

        QString re = "";

        QByteArray bytearray = mSerial->readAll();

        //hex char[] 转QString

        for(int i = 0; i < bytearray.length(); i++){
    
    
            if((unsigned char)bytearray[i] > 255)
                re.append("Error ");
            re.append("0x" + QString::number((unsigned char)bytearray[i],16) + " ");
        }

        ui->textBrowser_intput->insertPlainText(re);
    }

}

支持自动换行显示

在数据接收槽函数中加上该代码,若在 Linux平台下则应该为 "\n"

    if(ui->checkBox_displayNewline->isChecked()){
    
    
        if(ui->textBrowser_intput->document()->toPlainText() != "")
            ui->textBrowser_intput->insertPlainText("\r\n");
    }

支持显示接收时间

添加该代码

    if(ui->checkBox_displayTime->isChecked()){
    
    
        ui->textBrowser_intput->insertPlainText(QDateTime::currentDateTime().toString("[hh:mm:ss:zzz] "));
    }

支持定时发送数据

使用定时器完成,在多选框中检测其选择状态并完成定时器开启、关闭操作

    mAutosendoutTimer = new QTimer(this);
    connect(mAutosendoutTimer,SIGNAL(timeout()),this,SLOT(slot_Timeout_Uartsendout()));

	void MainWindow::slot_Timeout_Uartsendout(){
    
    
    on_buttom_sendout_clicked();

	void MainWindow::on_checkBox_sendoutAutoResend_clicked(bool checked)
{
    
    
    if(checked){
    
    

        if(s_connect == uart_state){
    
    
            mAutosendoutTimer->start(ui->lineEdit_AutoResend->text().toInt());
        }
        else{
    
    
            setNewsColor(Qt::red);
            ui->label_news->setText("SerialPort is't Connect.");
            return;
        }
    }
    else{
    
    
        if(mAutosendoutTimer->isActive())
            mAutosendoutTimer->stop();
    }
}
}

串口使用过程的错误将显示至底部消息栏

除了打开关闭串口的结果会显示到底部消息栏,还绑定了QSerialPorterror 信号

        connect(mSerial,SIGNAL(errorOccurred(QSerialPort::SerialPortError)),
                this,SLOT(slot_uartError(QSerialPort::SerialPortError)));

	void MainWindow::slot_uartError(QSerialPort::SerialPortError error){
    
    

    	QMetaEnum metaError = QMetaEnum::fromType<QSerialPort::SerialPortError>();
    	ui->label_news->setText(metaError.valueToKey(error));
    	setNewsColor(Qt::red);
	}

支持自定义波特率

我们的波特率选项栏是 QComboBox,若想实现自定义波特率,则需要将其变为Edit
这里借助了setLineEdit(),并用正则现在其输入

void MainWindow::on_comBox_uartDps_currentIndexChanged(int index)
{
    
    
    //自定义波特率
    if(8 == index){
    
    
        QLineEdit *lineEdit = new QLineEdit(this);
        ui->comBox_uartDps->setLineEdit(lineEdit);

        lineEdit->clear();
        lineEdit->setFocus();

        //正则限制输入
        QRegExp rx("[0-9]+$");
        QRegExpValidator *validator = new QRegExpValidator(rx, this);
        lineEdit->setValidator(validator);
    }
    else{
    
    
        ui->comBox_uartDps->setEditable(false);
    }
}

打开串口后仍可修改串口参数

StopBit 为例:

void MainWindow::on_comBox_uartStopBit_currentIndexChanged(int index)
{
    
    
    if(s_connect == uart_state){
    
    

         QSerialPort::StopBits mStopBits = (QSerialPort::StopBits)(index + 1);


        if(mSerial->setStopBits(mStopBits)){
    
    
            setNewsColor(Qt::black);
            ui->label_news->setText("SerialPort setStopBits is OK.");
        }
        else{
    
    
            setNewsColor(Qt::red);
            ui->label_news->setText("SerialPort setStopBits is Error.");
        }
    }
}

点击端口实现刷新

void MainWindow::Init_UartPort(){
    
    

    ui->comBox_uartPort->clear();

    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
    
    
        ui->comBox_uartPort->addItem(info.portName());
    }

}

void MainWindow::on_comBox_uartPort_clicked(){
    
    
    Init_UartPort();
}

效果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_40774605/article/details/105869293