RYMCU

Qt5串口调试助手(7)--十六进制发送、接收,显示接收时间功能等

Hugh 4 年前
# 串口调试助手 # 十六进制

概述

对于嵌入式调试来说,十六进制发送和接收功能是必不可少的 !在某些时候我们希望软件能够自动添加换行、并且能显示数据的接收时间。当然,我们同样需要有停止显示功能,即在接收的过程中停止显示数据,方便查询历史数据,而不需要改动串口硬件。一键清空发送区、接收区内容当然也是必不可少。

1.功能演示

十六进制功能.png

2.十六进制发送功能实现

step1:在发送槽函数中判断软件界面是否选中,以及是否需要发送换行符,从而实现十六进制功能,代码如下

/***********************************************************
 *发送按钮槽函数
 * 1.读取发送窗口数据
 * 2.判断发送格式,并格式化数据
 *  2.1 十六进制发送,是否添加新行
 *  2.2 文本发送,是否添加新行
 * 3.发送串口数据
 * 4.统计发送流量,并显示在状态栏
 ***********************************************************/
void MainWindow::on_pushButtonSend_clicked()
{
   QByteArray ComSendData;
   QString SendTemp;
   int temp;

   //读取发送窗口数据
   SendTemp = ui->TextSend->toPlainText();

   //判断发送格式,并格式化数据
   if(ui->checkBoxSendHex->checkState() != false)//16进制发送
   {
       if(ui->checkBoxAddNewShift->checkState() != false)
       {
           SendTemp.append("0D0A");// 后面添加换行
       }
       ComSendData = QByteArray::fromHex(SendTemp.toUtf8()).data();//获取字符串
   }
   else //字符串形式发送
   {
       if(ui->checkBoxAddNewShift->checkState() != false)
       {
           SendTemp.append("rn");// 后面添加换行
       }
        ComSendData = SendTemp.toLocal8Bit().data();//获取字符串
   }
   //发送数据
   temp = MyCom.write(ComSendData);

   //统计发送流量,并显示在状态栏
   if(temp)
   {
       ComSendSum +=temp;//发送总数统计
       setNumOnLabel(qlbSendSum, "Tx: ", ComSendSum);// 状态栏显示计数值
   }
}

step2: 接收数据槽函数中判断软件界面是否选中了十六机制、接收时间显示,并进行相应处理,代码如下

/***********************************************************
 *串口接收槽函数
 * 1.接收数据,并显示在接收窗口
 * 2.显示过程中需要判断:
 *  2.1 是否需要16进制显示
 *  2.2 是否需要显示时间
 *  2.3 是否停止显示
 ***********************************************************/
void MainWindow::MyComRevSlot()
{
    QByteArray MyComRevBUff;//接收数据缓存
    QString StrTemp,StrTemp1,StrTimeDate;

    //停止接收延时定时器,读取串口接收到的数据,并格式化数据
    recvDelayTimer->stop();
    MyComRevBUff = MyCom.readAll();
    StrTemp = QString::fromLocal8Bit(MyComRevBUff);

    //接收流量统计,并显示到状态栏
    ComRevSum += MyComRevBUff.size();
    setNumOnLabel(qlbRevSum, "Rx: ", ComRevSum);

    //获取串口数据接收的系统时间,备后续使用
    curDateTime = QDateTime::currentDateTime();
    StrTimeDate = curDateTime.toString("[yyyy-MM-dd hh:mm:ss.zzz] ");

    //开始显示数据,显示模式包括:是否16进制,是否显示接收时间
    if(ui->checkBoxRevHex->checkState() == false)//正常文本显示
    {

        if(TimeDateDisp == true)//显示接收时间
        {
            StrTemp.prepend(StrTimeDate);//前面添加时间
            StrTemp.append("rn");//后面添加换行
        }
        if(StopDis == false)
         {
            ui->TextRev->insertPlainText(StrTemp);//显示数据
            ui->TextRev->moveCursor(QTextCursor::End);//光标移动到文本末尾
        }
    }
    else //16进制显示
    {
       StrTemp =  MyComRevBUff.toHex().toUpper();//转换为16进制数,并大写

       for(int i = 0; i<StrTemp.length (); i+=2)//整理字符串,即添加空格
       {
           StrTemp1 += StrTemp.mid (i,2);
           StrTemp1 += " ";
       }

       if(TimeDateDisp == true)//添加时间显示
       {
           StrTemp1.prepend(StrTimeDate);//前面添加时间
           StrTemp1.append("rn");//后面添加换行
       }
       if(StopDis == false)
       {
         ui->TextRev->insertPlainText(StrTemp1);//显示数据
         ui->TextRev->moveCursor(QTextCursor::End);//光标移动到文本末尾
       }
    }  
}

step3:清空发送、接收区内容,同时请空流量统计

/***********************************************************
 *清空接收区按钮槽函数
 * 1.清空接收区
 * 2.清空流量统计
 ***********************************************************/
void MainWindow::on_pushButtonClearRev_clicked()
{
   ui->TextRev->clear();

   ComSendSum = 0;
   ComRevSum  = 0;

   setNumOnLabel(qlbSendSum, "Tx: ", ComSendSum);
   setNumOnLabel( qlbRevSum, "Rx: ", ComRevSum);
}

/***********************************************************
 *清空发送区按钮槽函数
 * 1.清空发送区
 * 2.清空流量统计
 ***********************************************************/
void MainWindow::on_pushButtonClearSend_clicked()
{
   ui->TextSend->clear();
   ComSendSum = 0;
   ComRevSum  = 0;

   setNumOnLabel(qlbSendSum, "Tx: ", ComSendSum);
   setNumOnLabel( qlbRevSum, "Rx: ", ComRevSum);
}

/***********************************************************
 *接收区停止显示槽函数
 * 1.设置停止接收标志位
 ***********************************************************/
void MainWindow::on_pushButtonStopRev_clicked()
{
    if(ui->pushButtonStopRev->text() == "停止显示")
    {
        ui->pushButtonStopRev->setText("继续显示");
        StopDis = true;
    }
    else
    {
        ui->pushButtonStopRev->setText("停止显示");
        StopDis = false;
    }
}

3.小结

完成了一些嵌入式调试的实用功能。

后发布评论