天天看點

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前言功能及實作效果

繼續閱讀