从零开始实现自己的串口调试助手(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);}}

效果演示

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【做一道算一道】字节实习笔试(A出来的两道)

快乐氛围 题意大概是派对上每个人的氛围值不同&#xff0c;值高的跟值低的打招呼&#xff0c;总氛围会产生变化&#xff0c;值相同的打招呼不产生变化&#xff0c;求整体派对的氛围值。 氛围值变化公式高值-低值 示例 输入&#xff1a; 3 2 4 0 输出&#xff1a; 8 意为&…

Kubernetes外部服务管理Ingress介绍

前言 在 Kubernetes 集群中&#xff0c;管理外部服务的访问和流量路由至关重要。通过使用 Ingress 控制器&#xff0c;我们能够实现对外部服务的有效管理&#xff0c;配置灵活的路由规则&#xff0c;并实现负载均衡和流量控制。 目录 一、Ingress 介绍 1. Ingress 概述 2.…

【求助】ansible synchronize 问题

求助贴&#xff0c;不是解答贴哈 最近把一台服务器从centos7.9升级到alibaba cloud linux3之后&#xff0c;出现了一个ansible的问题。 版本是ansible8.3.0ansible-core-2.15.3&#xff0c;在使用synchronize模块时&#xff0c;我使用了别名&#xff08;比如web1&#xff09;会…

Windows下搭建Cmake编译环境进行C/C++文件的编译

文章目录 1.下载Cmake2.安装MinGW-w643.进行C/C文件的编译 1.下载Cmake 网址&#xff1a;https://cmake.org/download/ 下载完成后安装&#xff0c;勾选“Add CMake to the system PATH for the current user" 点击Finish完成安装&#xff0c;在cmd窗口验证一下是否安…

C++并发之线程(std::thread)

目录 1 概述2 使用实例3 接口使用3.1 construct3.2 assigns3.3 get_id3.4 joinable3.5 join3.6 detach3.7 swap3.8 hardware_concurrency 1 概述 Thread类来表示执行的各个线程。   执行线程是指可以在多线程环境中与其他此类序列同时执行的指令序列&#xff0c;同时共享相同…

python使用pandas的常用操作

文章目录 安装导入主要数据结构常用方法和操作创建数据结构读取和写入数据数据选择和过滤数据操作基本统计分析分组和聚合合并和连接重塑数据1. pivot 和 pivot_table2. melt3. stack和 unstack 常用方法总结pandas操作excel安装相关库 读取单个工作表读取指定工作表读取多个工…

短视频矩阵系统源码---开发BS架构B/S(Browser/Server Architecture)架构

短视频矩阵系统源头开发------- 第一款叫做筷子科技&#xff0c;这个筷子科技剪辑和发布都是没有问题的&#xff0c;但是前一段时间他的剪辑发个公告&#xff0c;每个账号只能发两条&#xff0c;另外它的唯一缺点就是它成本比较高的&#xff0c;入门门槛应该在12800左右&#…

CHATGPT升级plus(已有账号前提下)

注册wildcard(虚拟卡) 注册号账号后先进行充值&#xff0c;充值后选择CHATGPT一键升级按照他的流程来即可 Wildcard网址&#xff1a;Wildcard跳转注册 填写邀请码充值时少两美金合计14&#xffe5; 邀请码&#xff1a;OL3QXTRH

【2022-2011年】地级市数字经济指数原始数据+测算dofile+结果

参照赵涛等&#xff08;2020&#xff09;的文章&#xff0c;利用熵值法对城市数字经济指数进行测算&#xff0c;包括原始数据、线性插值、回归填补3种版本下测算的数字经济指数。保留原始数据、stata代码和测算结果&#xff0c;大家可进行复现 一、数据介绍 数据名称&#x…

useState和store的区别

useState 和 useStore 是 React 应用中用于管理数据状态的两种不同的 Hook。它们在功能和用途上有一些区别&#xff1a; useState useState 是 React 提供的一个 Hook&#xff0c;用于在函数组件中添加局部状态。每个 useState 调用都会返回一个数组&#xff0c;包含两个元素…

Python爬虫协程批量下载图片

import aiofiles import aiohttp import asyncio import requests from lxml import etree from aiohttp import TCPConnectorclass Spider:def __init__(self, value):# 起始urlself.start_url value# 下载单个图片staticmethodasync def download_one(url):name url[0].spl…

电机启动器:变频驱动器故障的原因

变频驱动器 (VFD)是 一种电子电机控制器&#xff0c;用于调节同步或感应电机 的转速 并驱动电力行业的负载。VFD也称为变频器、逆变器驱动器、交流驱动器、可调频驱动器、可调速驱动器、微型驱动器或变速驱动器&#xff0c;其 功能是选择电压频率并在用于驱动电机之前改变它。 …

12年外贸人的肺腑之言

转自Vicky 大家好&#xff0c;作为一个有着12年外贸经验的老鸟&#xff0c;今天我要和大家分享一些宝贵的建议&#xff0c;这些建议可能会对你的外贸之路产生重大影响。拿好小本本&#xff0c;记好笔记&#xff0c;我们直接进入正题。 首先&#xff0c;如果你决心要在外贸领域…

几万块投入,预防几百万损失——客户风险管理如何高效落地?

作为公司的风控负责人&#xff0c;老张近来最头疼的莫过于某大客户突然暴雷&#xff0c;一次性“送”了公司几十万坏账。事后复盘&#xff0c;老张发现公司现有的客户风险管理体系已相对落后&#xff0c;不再适用于快速变化的商业环境&#xff1a; 客户风险定级依靠销售人员提…

哥斯拉、冰蝎、中国蚁剑在护网中流量特征分析,收藏起来当资料吧,24年护网用得上

护网哥斯拉、冰蝎、中国蚁剑流量分析 【点击免费领取】CSDN大礼包&#xff1a;《黑客&网络安全入门&进阶学习资源包》&#x1f517;包含了应急响应工具、入侵排查、日志分析、权限维持、Windows应急实战、Linux应急实战、Web应急实战。 护网中最担心的是木马已经到了服…

Java2实用教程上机实践9,10,11

前言 大家好呀&#xff0c;大家肯定遇到过学校布置的作业不会做的情况吧&#xff1f;这个时候大量的网上找资料&#xff0c;找如何做这道题&#xff0c;为了帮助用Java2实用教程&#xff08;耿祥义 张跃平主编&#xff09;的学子们拿满平时分&#xff0c;这里整理出这本书中比…

数据集成赛道重回数据领域兵家“必争之地”!

作者 | 郭炜 导读&#xff1a;此前&#xff0c;《技术成熟度曲线2024》第一、二部分内容已发布&#xff0c;详见《「从ETL 到ELT&#xff0c;到 EtLT的趋势」》、《数据集成成熟度模型解读》。本文为报告的最后一篇&#xff0c;主要对数据集成技术进行趋势预测与总结&#xff0…

python的DataFrame和Series

Series、DataFrame 创建 pd.Series() pd.DataFrame() # 字典{列名:[值1&#xff0c;值2],} [[]] [()] numpy Pandas的底层的数据结构&#xff0c;就是numpy的数组 ndarray 常用属性 shape (行数&#xff0c;) (行数&#xff0c;列数) values → ndarray index 索引名 siz…

华为管理工程部的前世今生

我们经常讲管理是一项系统工程&#xff0c;但在企业实际的管理建设和改进中&#xff0c;往往又并没有把管理当作一项系统工程来对待&#xff0c;更没有通过持续的管理变革或业务变革&#xff08;BT&#xff0c;Business Transformation&#xff09;来打造这一系统工程&#xff…