从零开始实现自己的串口调试助手(5) -实现HEX显示/发送/接收

ops/2024/10/18 18:17:12/

实现HEX显示: 


 HEX 显示 -- 其实就是 十六进制显示 --> a - 97(10) --> 61(16)

添加槽函数(bool):

实现槽函数:

注意: 

 注意QString 没有处理HEX显示的相关API 需要使用 toUtf-8 来 转换位QByteArry 类型,

利用其中的API 来处理HEX格式(toHex   fromHex)

cpp">void Widget::on_checkBox_HexDisplay_clicked(bool checked)
{if(checked){ // 吧把格式转为HEX格式显示// 获得 内容QString tmp =  ui->textEditRev->toPlainText();// 改为HEX格式QByteArray qtmp = tmp.toUtf8(); // 先把QString  转为 QByteArrayqtmp = qtmp.toHex(); // QByteArray 类型的数据可以直接转为HEX格式//显示// 注意要先将 QByteArry类型的数据转为QString 类型 才能setTextui->textEditRev->setText(QString::fromUtf8(qtmp));}else{ // 取消勾选,把HEX格式 转为基本格式// 获得HEX格式的内容QString tmpHex  =  ui->textEditRev->toPlainText();//改回基本格式QByteArray tmpArry = tmpHex.toUtf8(); // 先将QString 类型转为QByteArry类型QByteArray tmpBase = QByteArray::fromHex(tmpArry); // 将HEX类型的数据转换回去//显示ui->textEditRev->setText(QString::fromUtf8(tmpBase));}}

运行结果

实现HEX接收

修改 代码:

接收框显示做 添加特殊判断 --> 是否HEX显示了

if 勾选了HEX显示,我们接收的时候就需要使用HEX显示来拼接显示

修改:on_SerialData_readToRead

cpp">
void Widget::on_SerialData_readToRead()
{QString recvMessage = serialPort->readAll();if(recvMessage != NULL){qDebug()<<"get Message: "<<recvMessage;if(ui->checkBox_HexDisplay->isChecked()){ // 已经勾选HEX格式// 将新收到的数据转为HEX类型QByteArray tmpHex = recvMessage.toUtf8().toHex();// 原来控件上的内容 也转为HEX格式  再拼接QString tmpStrOld=ui->textEditRev->toPlainText(); //获得接收框的数据tmpHex = tmpStrOld.toUtf8() + tmpHex; // 不能toHex 已经是Hex了ui->textEditRev->setText(QString::fromUtf8(tmpHex));}else{if(sendTimeStatus){//更新myTimegetSysTime();// 在myTime两边添加方括号//            QString myTimeWithBrackets = "【" + myTime + "】";//            // 创建一个QString对象,首先添加带方括号的myTime,然后添加sendData//            QString result = myTimeWithBrackets + QString(recvMessage);//            qDebug()<<result;//            ui->textEditRev->append(result);ui->textEditRev->append("【"+myTime+"】"+recvMessage);}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));}
}

运行效果

HEX显示:

HEX显示
 

添加HEX发送

修改:on_btnSendContext_clicked

cpp">void Widget::on_btnSendContext_clicked()
{// const char * sendData = ui->lineEdit_SendContext->text().toStdString().c_str();//QString->String(C++)->char*0const char * sendData = ui->lineEdit_SendContext->text().toLocal8Bit().constData();int writeCnt = 0;//通过串口发送://HEX发送 实现if(ui->checkBox_HexSend->isChecked()){ //if HEX发送被勾选了// 获得发送框内的数据QString tmp = ui->lineEdit_SendContext->text();// 判断是否是偶数位QByteArray tmpArry = tmp.toLocal8Bit(); // QByteArry类型方便计算位数if(tmpArry.size()%2!=0){ui->label_SendStatus->setText("Error Input!");return;}// (逐位)判断是否符合16进制的表达for(char c:tmpArry){if(!std::isxdigit(c)){ //判断c是否符合16进制数的表达ui->label_SendStatus->setText("Error Input!");return;}}//确认可以转为16进制格式,转位16进制,进行发送// 用户输入1,变成1 ,拒绝变成字符1,对应ASCLL = 49QByteArray arrySend = QByteArray::fromHex(tmpArry);writeCnt = serialPort->write(arrySend);}else{ //非HEX发送,直接发送 即可writeCnt = serialPort->write(sendData);}if(writeCnt == - 1){ui->label_SendStatus->setText("SendError!");}else {writeCntTotal += writeCnt;qDebug()<<"Send:"<<sendData;qDebug()<<"writeCnt"<<writeCnt;ui->label_SendStatus->setText("SendOK!");//ui->label_SendCnt->setNum(writeCntTotal);ui->label_SendCnt->setText("Send:"+QString::number(writeCntTotal));if(strcmp(sendData,sendBak.toStdString().c_str())!=0){ //只有当数据与上一次不相等的时候我们才会追加到我们的历史发生中ui->textEditRecord->append(sendData);//sendBak = QString(sendData);sendBak = QString::fromUtf8(sendData);}}
}

运行效果:

我们先发了一组常规的01

再勾选HEX发送,发了一组HEX格式的01,输出结果如下:

解读一下:

Hex格式:30310a01

3031 -- 01 对的ASCLL

0 - 换行

01 - HEX发送的01,与HEX显示的接收没有=差别

优化HEX显示

修改槽函数on_checkBox_HexDisplay_clicked

优化内容:

大写显示

(每两个数据)空格分开

cpp">void Widget::on_checkBox_HexDisplay_clicked(bool checked)
{if(checked){ // 吧把格式转为HEX格式显示// 获得 内容QString tmp =  ui->textEditRev->toPlainText();// 改为HEX格式QByteArray qtmp = tmp.toUtf8(); // 先把QString  转为 QByteArrayqtmp = qtmp.toHex(); // QByteArray 类型的数据可以直接转为HEX格式//显示// 注意要先将 QByteArry类型的数据转为QString 类型 才能setText//ui->textEditRev->setText(QString::fromUtf8(qtmp));QString lastShow;tmp  = QString::fromUtf8(qtmp);for(int i=0;i<tmp.size();i+=2){lastShow += tmp.mid(i,2) + " "; //去tmp第i位往后两个数,在加上空格拼接}ui->textEditRev->setText(lastShow.toUpper());}else{ // 取消勾选,把HEX格式 转为基本格式// 获得HEX格式的内容QString tmpHex  =  ui->textEditRev->toPlainText();//改回基本格式QByteArray tmpArry = tmpHex.toUtf8(); // 先将QString 类型转为QByteArry类型QByteArray tmpBase = QByteArray::fromHex(tmpArry); // 将HEX类型的数据转换回去//显示// ui->textEditRev->setText(QString::fromUtf8(tmpBase));ui->textEditRev->setText(tmpBase);}}

效果演示


http://www.ppmy.cn/ops/47136.html

相关文章

Python基础包有哪些:探索Python编程的基石

Python基础包有哪些&#xff1a;探索Python编程的基石 Python&#xff0c;作为一种强大且易于学习的编程语言&#xff0c;其广泛的应用领域得益于众多基础包的支持。这些基础包为Python开发者提供了丰富的功能和工具&#xff0c;帮助他们更高效地完成各种编程任务。本文将围绕…

QT入门知识回顾

1 QT简介 1.1 Qt模块: Qt Core模块: 是QT类库的核心&#xff0c;所有其他模块都依赖这个模块 Qt Gui模块: 提供GUI程序的基本功能 Qt Network模块:提供跨平台的网络功能 Qt Widgets模块:提供创建用户界面的功能 1.2Qt的signal/slot机制 任何一个类只要类体前部书写 Q_OBJ…

2024下半年软考报名是什么时候?应该如何应对?

2024上半年的软考考试已经结束&#xff0c;准备参加2024下半年软考考试的考生也可以开始备考啦&#xff01;这个阶段考生们应该做些什么以备战下半年的考试呢&#xff1f; 2024下半年软考报名时间 根据上半年部分地区发布的报名通知可以得出&#xff1a;下半年报名8月19日起。…

服务器数据恢复—EVA存储异常断电重启后虚拟机无法启动如何恢复数据?

服务器存储数据恢复环境&#xff1a; 某品牌EVA8400&#xff0c;服务器上安装VMware ESXi虚拟化平台&#xff0c;虚拟机的虚拟磁盘包括数据盘&#xff08;精简模式&#xff09;快照数据盘&#xff0c;部分虚拟机中运行oracle数据库和mysql数据库。 服务器存储故障&检测&…

UML静态图-类图

概述 静态图包含类图、对象图和包图的主要目的是在系统详细设计阶段&#xff0c;帮助系统设计人员以一种可视化的方式来理解系统的内部结构和代码结构&#xff0c;包括类的细节、类的属性和操作、类的依赖关系和调用关系、类的包和包的依赖关系。 一、类图的表示法 类图(Cla…

5、css3 自动动画渐变背景

效果例图&#xff1a;&#xff08;因gif图片太大&#xff0c;而csdn只能上传小于5m图片&#xff0c;所以无法上传&#xff09; 1、首先上传html代码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8">&l…

[每日一练]患某种疾病的患者,正则表达式的匹配

该题目来源于力扣&#xff1a; 1527. 患某种疾病的患者 - 力扣&#xff08;LeetCode&#xff09; 题目要求&#xff1a; 患者信息表&#xff1a; Patients ----------------------- | Column Name | Type | ----------------------- | patient_id | int | | pati…

ubuntu网络图标消失解决

ubuntu 18.04网络图标消失不见解决方法 解决方法&#xff1a; 依次输入以下指令&#xff08;前提已设置好桥接模式或NAT模式&#xff09;&#xff1a; 1.sudo service network-manager stop 2.sudo rm /var/lib/NetworkManager/NetworkManager.state 3.sudo service networ…