从零开始实现自己的串口调试助手(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  转为 QByteArray
        qtmp = qtmp.toHex(); // QByteArray 类型的数据可以直接转为HEX格式
        //显示
        // 注意要先将 QByteArry类型的数据转为QString 类型 才能setText
        ui->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){
                //更新myTime
                getSysTime();

                // 在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*0
    const 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 = 49
        QByteArray 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  转为 QByteArray
        qtmp = 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);
    }


}

效果演示

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python 机器学习 基础 之 【实战案例】新闻内容分类实战

Python 机器学习 基础 之 【实战案例】新闻内容分类实战 目录 Python 机器学习 基础 之 【实战案例】新闻内容分类实战 一、简单介绍 二、新闻内容分类实战 三、数据准备 四、分词与清洗工作 1、读取数据 2、使用 jieba 分词器进行分词&#xff0c;使用 Pandas 创建Data…

【网络层】IP因特网协议解析

文章目录 IP报文结构分片TTL&#xff1a;time to live 生存时间 &#xff08;生命值&#xff09;Protocol 协议 网络层位于数据链路层与传输层之间。网络层中包含了许多协议&#xff0c;其中最为重要的协议是IP协议。网络层提供IP路由功能。 IP报文结构 版本version&#xff1…

20240604将OK3588-C的核心板刷机Buildroot之后强制横屏

20240604将OK3588-C的核心板刷机Buildroot之后强制横屏 2024/6/4 17:13 viewproviewpro-ThinkBook-16-G5-IRH:~/repo_RK3588_Buildroot20240508/kernel/arch/arm64/boot/dts/rockchip$ grep dsi0 . -R ./Makefile:dtb-$(CONFIG_ARCH_ROCKCHIP) rk3568m-serdes-evb-display-dsi…

【玩转C语言】第一讲--->C语言概念

&#x1f525;博客主页&#x1f525;&#xff1a;【 坊钰_CSDN博客 】 欢迎各位点赞&#x1f44d;评论✍收藏⭐ 目录 引言&#xff1a; 1. C语言是什么 2. C语言的辉煌历史 3. 第一个C语言程序 4. main()函数 5. printf() 函数 6. 库函数 6.1 库函数概念 7. 关键字介绍 …

巨详细Linux安装MySQL

巨详细Linux安装MySQL 1、查看是否有自带数据库或残留数据库信息1.1检查残留mysql1.2检查并删除残留mysql依赖1.3检查是否自带mariadb库 2、下载所需MySQL版本&#xff0c;上传至系统指定位置2.1创建目录2.2下载MySQL压缩包 3、安装MySQL3.1创建目录3.2解压mysql压缩包3.3安装解…

Kubernetes——Ingress详解

目录 前言——Service策略的作用 1.外部访问方案 2.使用场景和限制 2.1NodePort 2.2LoadBalancer 2.3externalIPs 2.4Ingress 3.Ingress如何实现对外服务 4.LB和Ingress结合起来实现对外服务的过程 一、Ingress 1.定义 2.组成 3.工作原理 4.总结 二、部署Nginx-I…

clickhouse学习笔记(二)数据类型

目录 一、基础数据类型 1、整数类型 2、浮点数类型 3、布尔类型 4、字符串和固定字符串 5、日期和时间类型 6、创建基础数据类型的建表语句及插入语句 二、复合数据类型 1、数组 2、元组 3、枚举类型 4、嵌套数据结构 5、Map 三、特殊数据类型 1、低基数编码&…

SwiftUI 利用 Swizz 黑魔法为系统创建的默认对象插入新协议方法(一)

功能需求 在 SwiftUI 的开发中,我们往往需要借助底层 UIKit 的“上帝之手”来进一步实现额外的定制功能。比如,在可拖放(Dragable)SwiftUI 的实现中,会缺失一些关键的回调方法让我们这些秃头码农们“欲哭无泪” 如上图所示,我们在拖放取消时将界面中的一切改变都恢复如初…

【调试笔记-20240604-Linux-为 OpenWrt-23.05 添加自己的 feed 软件包】

调试笔记-系列文章目录 调试笔记-20240604-Linux-为 OpenWrt-23.05 添加自己的 feed 软件包 文章目录 调试笔记-系列文章目录调试笔记-20240604-Linux-为 OpenWrt-23.05 添加自己的 feed 软件包 前言一、调试环境操作系统&#xff1a;Ubuntu 22.04.4 LTS编译环境调试目标 二、…

《python》poetry install下载缓慢,网络问题断开连接--poetry换源镜像下载+国内镜像

在使用打包工具poetry进行打包的是出现了一个问题就是&#xff0c;在使用poetry进行打包的时候出现了&#xff0c;连接断开这样的问题&#xff0c;这个问题是可以通过换源&#xff0c;通过国内的镜像来解决这个问题就可以了。 找到项目中的pyoroject。toml文件这个文件中写了一…

ESP8266 01sWiFi模块保姆级教程 烧录和联网,连接华为云

前言 写在前面。 这个esp01s联网真的是折磨人啊&#xff0c;浪费了我三四天的时间&#xff0c;网上各种教程叫天天不灵&#xff0c;叫地地不灵&#xff0c;所以才有了这篇教程&#xff0c;致力于帮助像我一样的小白少踩坑&#xff0c;我可以说是把能踩的坑都塌了一遍。 烧录…

Spring运维之boot项目多环境(yaml 多文件 proerties)及分组管理与开发控制

多环境开发(yaml文件版) 我们在自己的开发中是自己环境 测试 生产的环境都不同 多环境分为 两个步骤 设置环境 生产环境 开发环境 测试环境 手搓三个环境 设置应用环境 应用pro配置 # 应用环境 spring:profiles:active: pro--- # 设置环境 # 生产环境 spring:profiles: p…

MySQL 存储过程(一)

本篇主要介绍MySQL存储过程的相关内容 目录 一、什么是存储过程&#xff1f; 二、基本语法 创建存储过程 调用存储过程 查看存储过程 删除存储过程 三、变量 系统变量 用户自定义变量 局部变量 四、存储过程的参数 in out inout 一、什么是存储过程&#xff1f…

No module named _sqlite3解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

RedHat9 | 控制启动过程

1、Linux系统启动引导流程 加电自检&#xff08;POST&#xff09;寻找启动顺序&#xff08;BIOS/UEFI)读取启动加载程序&#xff08;MBR->Bootloader)加载内核与内存文件系统&#xff08;kernel-initramfs)加载硬件及驱动&#xff08;/lib/modules或/lib64/modules)初始化系…

9 -力扣高频 SQL 50 题(基础版)

9 - 上升的温度 -- 找出与之前&#xff08;昨天的&#xff09;日期相比温度更高的所有日期的 id -- DATEDIFF(2007-12-31,2007-12-30); # 1 -- DATEDIFF(2010-12-30,2010-12-31); # -1select w1.id from Weather w1, Weather w2 wheredatediff(w1.recordDate,w2.recordDat…

数组的详细介绍

数组是一组相同类型元素的集合&#xff0c;也就是说&#xff1a;数组至少包含两个及以上的元素&#xff0c;且元素类型相同。 数组包括一维数组和多维数组&#xff0c;其中二维数组最常见。下面我们一一介绍。 一维数组&#xff1a; 格式&#xff1a;type name [常量值]&…

微信短视频怎么收藏?成都鼎茂宏升文化传媒公司

微信短视频怎么收藏&#xff1f;一文教你轻松掌握 随着微信功能的不断升级&#xff0c;微信短视频已经成为我们日常生活中不可或缺的一部分。无论是朋友分享的生活点滴&#xff0c;还是公众号推送的精彩内容&#xff0c;短视频都以其直观、生动的形式&#xff0c;吸引着我们的…

Qt——控件

目录 概念 QWidget核心属性 enabled geometry WindowFrame的影响 windowTitle windowIcon qrc的使用 windowOpacity cursor font toolTip focusPolicy ​编辑 styleSheet 按钮类控件 PushButton RadioButton CheckBox 显示类控件 Label textFormat pixm…

什么牌子的洗地机好?高端旗舰洗地机,清洁力强的洗地机品牌

科技水平的不断进步&#xff0c;人们对生活环境的要求日益提高&#xff0c;洗地机作为一种高效&#xff0c;便捷的清洁设备&#xff0c;在家务清洁中&#xff0c;越来越受重视&#xff0c;洗地机不仅在吸尘、拖地和深度清洁等方面表现出色&#xff0c;可以帮助用户轻松应对各种…