天天看点

Qt - 串口调试助手UHelper前言功能及实现效果

前言

前面介绍了串口类

QSerialPort

及其辅助类

QSerialPortInfo

写了综合一点的项目 - 串口调试助手

项目源码已上传到 GitHub

UI

部分就不展开了,直接放张图吧

Qt - 串口调试助手UHelper前言功能及实现效果

功能及实现

数据发送及接收均支持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();
    }
}
}
           

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

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

QSerialPort

error

信号

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();
}

           

效果

Qt - 串口调试助手UHelper前言功能及实现效果

继续阅读