一、前言

开发环境:Qt5.12.10 + MinGW

  • 串口数据的接收
  • ascii字符形式显示与hex字符形式显示
  • 时间戳的显示
  • 接收数据的统计与显示
  • 接收清零
  • QSerialPort类的使用
  • 数据格式的转换
  • QTime类的使用
  • 控件QTextEditQCheckBoxQPushButtonQLabel的使用

QT串口助手(三):数据接收-LMLPHP

二、功能实现

下面开始逐步讲解以上列举的功能实现

2.1、数据读取

《QT串口助手(二):参数配置》中已经实现了串口参数的配置,参数配置完成后就可以开启串口的数据接收功能了。在QT中的QSerialPort类继承自QIODevice类,所以可以使用QIODevice的readyRead()信号来触发数据的接收,在槽函数中实现数据的读取与处理。信号槽连接如下:

/* 接收数据信号槽 */
connect(serial, &QSerialPort::readyRead, this, &Widget::SerialPortReadyRead_slot);

当有收到新数据信号时,就会执行槽函数里面的数据读取功能:

/*读取串口收到的数据*/
QByteArray bytedata = serial->readAll();

2.2、数据转换

若需要将接收到的数据以HEX格式显示,则需要对接收到的数据进行以下处理:

/*将数据转换为hex格式并以空格分隔->去掉头尾空白字符->转换为大写形式*/
framedata = bytedata.toHex(' ').trimmed().toUpper();

2.3、添加时间戳

有时为了便于观察数据收发时间,需要在数据前插入时间戳显示。使用QTime类中的方法可以获取当前系统的时间(精确到ms),对数据处理如下:

/*在数据前插入时间戳:[时:分:秒:毫秒]:RX -> 数据*/
framedata = QString("[%1]:RX -> %2").arg(QTime::currentTime().toString("HH:mm:ss:zzz")).arg(framedata);

2.4、接收计数

使用一个quint32类型数据对每次接收数据长度进行累加,记录接收数据总数,然后将数据更新到ui界面:

dataTotalRx += bytedata.length();
ui->RxCnt_label->setText(QString::number(dataTotalRx));

2.5、数据显示

以上功能完成后将数据显示到接收框中(为了区分不同显示格式,做了不同的颜色显示)。完整的数据接收功能展示如下:

/*
    函   数:SerialPortReadyRead_slot
    描   述:readyRead()信号对应的数据接收槽函数
    输   入:无
    输   出:无
*/
void Widget::SerialPortReadyRead_slot()
{
    QString framedata;
    /*读取串口收到的数据*/
    QByteArray bytedata = serial->readAll();

    /*数据是否为空*/
    if (!bytedata.isEmpty())
    {
        if(ui->HexDisp_checkBox->isChecked())
        {
            /*hex显示*/
            framedata = bytedata.toHex(' ').trimmed().toUpper();
            ui->Receive_TextEdit->setTextColor(QColor(Qt::green));
        }
        else
        {
            /*ascii显示*/
            framedata = QString(bytedata);
            ui->Receive_TextEdit->setTextColor(QColor(Qt::magenta));
        }

        /*是否显示时间戳*/
        if (ui->TimeDisp_checkBox->isChecked())
        {
            framedata = QString("[%1]:RX -> %2").arg(QTime::currentTime().toString("HH:mm:ss:zzz")).arg(framedata);
            ui->Receive_TextEdit->append(framedata);
        }
        else
        {
            ui->Receive_TextEdit->insertPlainText(framedata);
        }

        /*更新接收计数*/
        dataTotalRxCnt += bytedata.length();
        ui->RxCnt_label->setText(QString::number(dataTotalRxCnt));
    }
}

演示效果如下:

QT串口助手(三):数据接收-LMLPHP

2.6、清除接收

清除接收按键点击后,会清除接收框显示的内容以及接收计数。使用QPushButton的点击信号槽实现如下:

/*
    函   数:on_ClearRx_Bt_clicked
    描   述:清除接收按键点击信号对应的槽函数
    输   入:无
    输   出:无
*/
void Widget::on_ClearRx_Bt_clicked()
{
    ui->Receive_TextEdit->clear();
    ui->RxCnt_label->setText(QString::number(0));
    dataTotalRxCnt = 0;
}

三、总结

本篇文章主要是讲述如何对串口数据进行接收和显示。除了上面列出的主要功能外,还需要了解各个控件的操作方法,比如QTextEdit文本的添加、QLabel文本的设置等。还有就是QT中基本的数据类型的数据使用,比如QStringQBytArray等。

01-24 11:12