当前位置: 首页> 汽车> 行情 > 从零开始实现自己的串口调试助手(4) -实现自动发送 / 时间显示

从零开始实现自己的串口调试助手(4) -实现自动发送 / 时间显示

时间:2025/7/9 6:26:45来源:https://blog.csdn.net/mx_jun/article/details/139389677 浏览次数: 0次

实现自动发送:checkBox

添加bool槽函数

bool 值,当√的时候为true

取消√ 位false

实现带bool 类型的槽函数:

void Widget::on_checkBox_SendInTime_clicked(bool checked)
{qDebug()<<"checkStatus:"<<checked;if(checked){ // 被勾选了//发送一次//on_btnSendContext_clicked();timer->start(ui->lineEdit_TimeEach->text().toInt()); // 读取框内的内容,更新发生频率// 发生的时候这两选择不能被修改ui->lineEdit_TimeEach->setEnabled(false);ui->lineEdit_SendContext->setEnabled(false);}else{// √取消就不发送timer->stop();ui->lineEdit_TimeEach->setEnabled(true);ui->lineEdit_SendContext->setEnabled(true);}
}


关联信号与槽: 定时器的使用

头文件定义:

 QTimer *timer;

构造函数初始化

timer  = new QTimer(this);
    // 关联信号与槽 --每次到点就发送一次connect(timer,&QTimer::timeout,[=](){on_btnSendContext_clicked();});

checkBox优化:


当关闭串口的时候的时候:
把√取消掉
并且关闭定时器
重新设置控件的是否可选

ui->checkBox_SendInTime->setCheckState(Qt::Unchecked);timer->stop();ui->lineEdit_TimeEach->setEnabled(false);ui->lineEdit_SendContext->setEnabled(true);

效果演示

解决遗留历史记录bug:

bug 描述: 当发送的字符串过于长的时候我们的历史记录有可能重复记录相同的字符串

我们只需要修改他的编码类型即可

解决方法: 换一种方式装换为 const char * 类型

还添加了显示Receive/send的优化

效果演示

==================================

实现清除接收 和 保存接收

清除接收

槽函数

void Widget::on_btnRevClear_clicked()
{ui->textEditRev->setText(""); // 实现清空接收
}

效果演示:

清空前  -->  清空后

保存接收:

槽函数

void Widget::on_btnRevSave_clicked()
{//为了save去打开QString fileName = QFileDialog::getSaveFileName(this, tr("Open File"),"F:/myqt/file_of_qt/serialData.txt",tr("Text (*.txt)"));if(fileName != NULL){QFile file(fileName);if (!file.open(QIODevice::WriteOnly | QIODevice::Text))return;QTextStream out(&file);out << ui->textEditRev->toPlainText();file.close();}
}

效果演示

QDataTime 获得当前系统时间

getSysTime()获得当前时间


先通过QDataTime 获取当前系统的日期和时间,再拼接获得当前时间

void Widget::getSysTime() // 构建我们当前的日期和时间
{QDateTime currentTime = QDateTime::currentDateTime(); // 获得当前日期// 获取日期QDate date  = currentTime.date();int year = date.year();int month = date.month();int day = date.day();//获取时间QTime time = currentTime.time();int hour = time.hour();int minute = time.minute();int second = time.second();
//QString 字符串拼接出我们需要的格式myTime = QString("%1-%2-%3  %4:%5:%6").arg(year).arg(month).arg(day).arg(hour).arg(minute).arg(second);}

刷新显示当前时间

再使用定时器去刷新时间

  定时器 加信号与槽 刷新时间


    QTimer * getSysTimeTimer = new QTimer(this);
    connect(getSysTimeTimer,SIGNAL(timeout()),this,SLOT(time_reflash));
    getSysTimeTimer->start(100); // 100ms 刷新一次时间

实现槽函数:

void Widget::time_reflash()
{//刷新一下当前系统时间  到 myTime中getSysTime();//将得到的时间再标签中显示ui->label_CurrentTime->setText(myTime);
}

效果演示

显示优化

设置参数指定大小

// 2 - 位宽 10 -- 基数,10进制 QChar('0')  -- 结束字符串 \0  -- 0尾巴
  myTime = QString("%1-%2-%3   %4:%5:%6").arg(year,2,10,QChar('0')).arg(month,2,10,QChar('0')).arg(day,2,10,QChar('0')).arg(hour,2,10,QChar('0')).arg(minute,2,10,QChar('0')).arg(second,2,10,QChar('0'));


接收到的消息显示当前时间:

思路:

设置一个flag去获取 下图中接收时间的 √选状态  -- bool 类型槽函数 -- 直接通过checked 去判断

再发送的时候判断一下这个flag,勾选状态的话就需要额外拼接一个字符串来输出到接收框内了

槽函数

void Widget::on_checkBox_RevTime_clicked(bool checked)
{if(checked){ //读取当前的系统时间sendTimeStatus = true;}else{sendTimeStatus = false;}}

修改后的接收函数


void Widget::on_SerialData_readToRead()
{QString recvMessage = serialPort->readAll();if(recvMessage != NULL){qDebug()<<"get Message: "<<recvMessage;if(sendTimeStatus){//更新myTimegetSysTime();// 在myTime两边添加方括号QString myTimeWithBrackets = "【" + myTime + "】";// 创建一个QString对象,首先添加带方括号的myTime,然后添加sendDataQString result = myTimeWithBrackets + QString(recvMessage);qDebug()<<result;ui->textEditRev->append(result);}else{ui->textEditRev->append(recvMessage);}readCntTotal += recvMessage.size();qDebug()<<"readCnt"<<recvMessage.size();//ui->label_RecvCnt->setNum(readCntTotal);ui->label_RecvCnt->setText("Receive:"+QString::number(writeCntTotal));}
}

实现效果

关键字:从零开始实现自己的串口调试助手(4) -实现自动发送 / 时间显示

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: