当前位置: 首页 > news >正文

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

实现HEX显示: 


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

添加槽函数(bool):

实现槽函数:

注意: 

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

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

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


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

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

优化内容:

大写显示

(每两个数据)空格分开

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);}}

效果演示

相关文章:

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

实现HEX显示: HEX 显示 -- 其实就是 十六进制显示 --> a - 97(10) --> 61(16) 添加槽函数(bool): 实现槽函数: 注意: 注意QString 没有处理HEX显示的相关API 需要使用 toUtf-8 来 转换位QByteArry 类型&#xff0c; 利用其中的API 来处理HEX格式(toHex fromHex) vo…...

【计算机毕设】基于SpringBoot的民宿在线预定平台设计与实现 - 源码免费(私信领取)

免费领取源码 &#xff5c; 项目完整可运行 &#xff5c; v&#xff1a;chengn7890 诚招源码校园代理&#xff01; 1. 研究目的 本研究旨在设计并实现一个基于SpringBoot的民宿在线预定平台。通过信息化手段提高民宿预定效率&#xff0c;方便用户查询房源、预定房间、在线支付和…...

大数据—数据分析概论

一、什么是数据分析 数据分析是指使用统计、数学、计算机科学和其他技术手段对数据进行清洗、转换、建模和解释的过程&#xff0c;以提取有用的信息、发现规律、支持决策和解决问题。数据分析可以应用于各种领域&#xff0c;包括商业、医学、工程、社会科学等。 二、数据分析步…...

centos7下卸载MySQL,Oracle数据库

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 操作系统版本为CentOS 7 使⽤ MySQ…...

Spring解决循环依赖

Spring框架为了解决循环依赖问题&#xff0c;设计了一套三级缓存机制&#xff1a; 一级缓存singletonObjects:这个是最常规的缓存&#xff0c;用于存放完成初始化好的bean&#xff0c;如果某个bean已经在这个缓存了直接返回。二级缓存earlySigletonObjects:这个用于存放早期暴…...

RUST运算符重载

在 Rust 中&#xff0c;可以使用特征&#xff08;traits&#xff09;来实现运算符重载。运算符重载是通过实现相应的运算符特征&#xff08;如 Add、Sub、Mul 等&#xff09;来完成的。这些特征定义在 std::ops 模块中。下面是一个简单的示例&#xff0c;展示如何为一个自定义结…...

描述一下 Array.forEach() 循环和 Array.map() 方法之间的主要区别

Array.forEach() 和 Array.map() 都是 JavaScript 数组中常用的方法,但它们之间有一些重要的区别: 返回值:forEach()&#xff1a;没有返回值,它只是对数组中的每个元素执行提供的函数。map()&#xff1a;返回一个新的数组,其元素是通过对原数组的每个元素执行提供的函数后的结…...

在GEE中显示矢量或栅格数据的边界(包含样式设计)

需要保证最后显示的数据是一个 FeatureCollection 对象。 如果数据是一个 Geometry 或 Image&#xff0c;我们也可以使用 style 方法来设置样式并将其添加到地图上。以下是针对不同类型对象的处理方式&#xff1a; 1 Geometry对象 如果 table 是一个 Geometry 对象&#xff…...

django使用fetch上传文件

在上一篇文章中&#xff0c;我包装了fetch方法&#xff0c;使其携带cookie。但是之前fetch传递的是json数据&#xff0c;现在有了一个上传文件的需求&#xff0c;因此需要进行修改&#xff1a; const sendRequest (url, method, data) > {const csrftoken Cookies.get(cs…...

linux安装docker步骤

步骤1 脚本自动安装 curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh 步骤2 启动Docker服务: sudo systemctl start docker 步骤3 验证Docker是否正确安装并运行一个容器: sudo docker run hello-world 安装正确&#xff0c;则可拉取镜像&am…...

Unity DOTS技术(一)简介

文章目录 一.概述二.将会介绍的内容三.DOTS技术与传统方式的不同传统问题DOTS技术 四.插件安装 一.概述 传统的游戏开发中,如果有成千上万的物体在场景中运动,那么你一定会认为是疯了.但有了Dost技术这一些都将变成可能.如图场景中有10000个物体在同时运动,帧率即能保持在60Fp…...

深度解读ChatGPT基本原理

一、基本原理 ChatGPT是一个基于深度学习的自然语言生成模型&#xff0c;使用了类似于GPT&#xff08;Generative Pre-trained Transformer&#xff09;的架构。GPT是由OpenAI开发的一种语言模型&#xff0c;能够生成与输入文本相关的连续性文本。 ChatGPT的基本原理是先使用…...

python实现——分类类型数据挖掘任务(图形识别分类任务)

分类类型数据挖掘任务 基于卷积神经网络&#xff08;CNN&#xff09;的岩石图像分类。有一岩石图片数据集&#xff0c;共300张岩石图片&#xff0c;图片尺寸224x224。岩石种类有砾岩&#xff08;Conglomerate&#xff09;、安山岩&#xff08;Andesite&#xff09;、花岗岩&am…...

【安卓跨进程通信IPC】-- Binder

目录 BinderBinder是什么&#xff1f;进程空间分配进程隔离Binder跨进程通信机制模型优点AIDL常见面试题 Binder 夯实基础之超详解Android Binder的工作方式与原理以及aidl示例代码 比较详细的介绍&#xff1a;Android跨进程通信&#xff1a;图文详解 Binder机制 原理 操作系统…...

大数据之Schedule调度错误(一)

当我们在利用ooize发起整个任务的调度过程中,如果多个调度任务同时运行并且多个调度任务操作了相同的表,那么就会出现如下的错误关系: Invalid path hdfs://iZh5w01l7f8lnog055cpXXX:8000/user/admin/xxx: No files matching path hdfs://iZh5w01l7f8lnog055cpXXX:8000/user/ad…...

DiffIR论文阅读笔记

ICCV2023的一篇用diffusion模型做Image Restoration的论文&#xff0c;一作是清华的教授&#xff0c;还在NIPS2023上一作发表了Hierarchical Integration Diffusion Model for Realistic Image Deblurring&#xff0c;作者里甚至有Luc Van Gool大佬。模型分三个部分&#xff0c…...

prometheus+alertmanager+webhook钉钉机器人告警

版本&#xff1a;centos7.9 python3.9.5 alertmanager0.25.0 prometheus2.46.0 安装alertmanager prometheus 配置webhook # 解压&#xff1a; tar -xvf alertmanager-0.25.0.linux-amd64.tar.gz tar -xvf prometheus-2.46.0.linux-amd64.tar.gz mv alertmanager-0.25.0.linu…...

ctfshow 年CTF web

除夕 Notice: Undefined index: year in /var/www/html/index.php on line 16 <?phpinclude "flag.php";$year $_GET[year];if($year2022 && $year1!2023){echo $flag; }else{highlight_file(__FILE__); } 弱比较绕过很简单&#xff0c;连函数都没有直…...

原型链、闭包、手写一个闭包函数、 闭包有哪些优缺点、原型链继承

什么是原型链&#xff1f; 原型链是一种查找规则 为对象成员查找机制提供一个方向 因为构造函数的 prototype 和其实例的 __ proto __ 都是指向原型对象的 所以可以通过__proto__ 查找当前的原型对象有没有该属性, 没有就找原型的原型, 依次类推一直找到Object( null ) 为…...

linux中SSH_ASKPASS全局变量的作用

在工作中遇到一段代码&#xff0c;通过SSH_ASKPASS全局变量实现了ssh登录远程IP时的密码输入&#xff0c;chatgpt搜索了一下&#xff0c;其解释大致如下所示&#xff1a; SSH_ASKPASS 是一个环境变量&#xff0c;它在 SSH 客户端需要用户输入密码时起作用。当 SSH 客户端检测到…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...