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

串口通信:hex、非hex格式 HEX格式:在HEX模式下,数据以十六进制的形式显示和发送,适合发送原始的字节数据,如协议数据或者二进制数据。这种方式在底层通信和硬件调试中非常常见,因为它可以精确地控制和查看每个字节的数据。非HEX(ASCII)格式:在非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);
    }


}

效果演示

基于Qt5与C++的串口调试助手开发:从原理到工程实践 串口通信是嵌入式开发、工控系统和物联网设备调试的基础技术,其核心在于通过异步I/O和事件驱动机制实现稳定可靠的数据交换。理解其底层原理,如波特率、数据帧和流控制,是进行高效硬件交互的关键。这项技术的工程价值在于能够直接与微控制器、传感器等底层硬件进行通信,是验证协议、诊断问题的必备手段。在实际应用中,开发者常面临数据解析、编码乱码和性能优化等挑战。通过使用Qt5的QSerialPort模块,可以构建跨平台的串口调试工具,有效解决数据收发不完整、中文乱码等常见问题,并实现定制化的协议解析与数据显示功能。本文聚 阅读详情

相关推荐

STM32开发必备:XCOM串口调试助手+CH340驱动一键安装包(附常见问题排查)

本文详细介绍了STM32开发中必备的XCOM串口调试工具和CH340驱动安装方法,提供了一键安装包及常见问题排查指南。内容涵盖串口调试工具对比、CH340驱动安装步骤、XCOM高级使用技巧,以及ST-LINK与串口下载的深度对比,帮助开发者快速搭建稳定的STM32开发环境。

echo99的专栏 860

串口助手(串口发送接收数据, 定时, 清空, hex显示)

这篇文章继续介绍 自制串口助手。串口助手(上)大家可以在此基础上 对自制的 串口助手 加以改进和开发。

wuyiyu_的博客 2万+

Qt串口通信实战:用QSerialPort从零搭建一个串口调试助手(附完整源码)

本文详细介绍了如何使用Qt的QSerialPort模块从零构建一个功能完备的串口调试助手,涵盖环境配置、核心功能实现、高级功能扩展及常见问题解决方案。通过实战代码示例,帮助开发者快速掌握串口通信技术,适用于嵌入式开发和工业控制领域。

weixin_29209805的博客 385

【USART】串口收发HEX数据包

【最终功能】串口收发HEX数据包

weixin_53328450的博客 2311

Python版串口调试工具开发指南:用PyQt5实现跨平台通信助手(附源码)

本文详细介绍了如何使用Python的PyQt5和PySerial库,从零开发一个功能完备、跨平台的串口调试助手。内容涵盖环境搭建、多线程通信、GUI界面设计、HEX/ASCII数据解析与显示等核心功能实现,并提供了完整的项目源码,帮助开发者快速构建自定义的串口调试工具。

weixin_29233333的博客 125

P28[9-4]STM32:串口收发HEX数据包理论篇(内含:1.实验现象+2.文本数据包/HEX数据包+ 3.文本数据包接收/HEX数据包接收)

STM32:串口收发HEX数据包理论篇(内含:1.实验现象+2.文本数据包/HEX数据包+ 3.文本数据包接收/HEX数据包接收)

wo12369874的博客 2152

Qt串口调试助手开发实战:从零搭建一个带HEX/ASCII切换的完整工具

本文详细介绍了如何使用Qt框架从零开发一个功能完备的串口调试助手。文章通过实战教学,重点讲解了串口通信的核心实现、HEX/ASCII双模式数据转换与显示的关键逻辑,以及如何构建一个健壮、易用的桌面工具,为嵌入式开发和硬件调试提供高效解决方案。

rr23456的博客 323

【STM32学习】——USART串口数据包&HEX/文本数据包&收发流程&串口收发HEX/文本数据包实操

本次学习有两个实操代码,第一个是串口收发HEX数据包,第二个是串口收发文本数据包做任何事情,都要有一股坚忍不拔的毅力,只要坚持,挺过风雨,终会看见彩虹;只要坚持,走过黑暗,总会拥抱黎明;只要坚持,战胜失败,总能赢得成功!今天的学习分享到此就结束了,我们下次再见!!STM32定时器输入捕获(IC)STM32定时器输出比较(PWM波)STM32定时中断STM32外部中断STM32GPIO精讲。

weixin_51658186的博客 6870

使用Qt/C++开发专业串口调试助手:从零到一完整实现

本文介绍了使用Qt/C++开发一款专业串口调试助手的全过程。该工具具备自动扫描串口、多格式数据收发(ASCII/HEX/十进制/二进制)、虚拟串口模拟、实时数据曲线绘制、命令轮询发送等核心功能,采用模块化设计,通过QSerialPort实现串口通信,QCharts实现数据可视化。文章详细阐述了系统架构、核心功能实现、UI设计、关键技术难点及解决方案,并提供了测试验证结果。项目代码约2000行,实现了配置持久化、中文乱码处理等实用特性,可作为嵌入式开发的实用工具或Qt学习的参考项目。

zqg282504061的博客 1383

Qt Widgets从零实现串口调试助手V1.0完整指南

串口通信是单片机、嵌入式设备与PC交互的基础方式,凭借简单可靠的特性,在工业控制、数据采集和硬件调试中占据重要地位。Qt作为跨平台C++开发框架,提供的QSerialPort模块封装了底层串口操作,支持波特率、数据位、校验位等参数配置,配合信号槽机制可实现高效的数据收发。理解readyRead信号与readAll的配合原理,能帮助开发者构建实时接收的数据通道,而Hex收发功能在协议调试中尤为关键。串口调试助手作为上位机开发的入门实践,也是嵌入式工程师的必备工具,广泛应用于设备调试、日志监控和自动化测试场景。

weixin_31815843的博客 317

从零开始实现自己的串口调试助手(10) - 优化 收尾 + 打包

串口调试助手的项目总结和优化

mx_jun的博客 1058

SSCom串口调试助手:跨平台串口通信终极指南

SSCom是一款专为Linux和macOS系统设计的免费串口调试工具,它为嵌入式开发者提供了简单高效的串口通信解决方案。无论你是物联网开发者、硬件工程师还是电子爱好者,这款跨平台串口调试助手都能帮助你快速连接设备、监控数据流、分析通信协议。 ## 为什么选择SSCom?三分钟了解核心优势 在嵌入式开发领域,串口调试是不可或缺的环节。SSCom凭借其简洁直观的界面和稳定的性能,成为众多开发者的首

gitblog_01006的博客 465

手写Python Qt串口调试助手:从环境搭建到实战避坑

串口通信是嵌入式开发与自动化测试中最基础也最常用的数据交互方式。在Windows或Linux平台下,使用Python和Qt可以快速构建图形化串口调试工具,其中PySide6负责界面展示,pyserial提供跨平台串口读写能力。为了确保高频率数据收发时界面不卡顿,通常采用QThread与信号槽机制实现异步读取,并结合日志落盘、表格模型优化和协议解析提升工具的实用性。这类自研串口调试助手适用于硬件调试、产线测试、设备通信验证等场景,能有效弥补通用工具在协议解析、数据可视化和二次集成方面的不足。从环境搭建、串口收

weixin_42631411的博客 173

Qt框架打造轻量级串口调试助手教程

串口通信是嵌入式开发中基础而关键的调试手段,通过UART协议实现设备间的数据交换。Qt框架的SerialPort模块封装了底层串口操作,开发者可以快速构建跨平台的串口工具。本教程详细讲解如何使用Qt Creator开发环境,从界面设计到核心功能实现,打造一个支持文本/十六进制收发、定时发送、数据记录等实用功能的串口调试助手。项目采用QSerialPort类处理底层通信,通过信号槽机制实现高效的数据收发,特别适合嵌入式开发者和Qt初学者学习串口编程与Qt实战开发。

weixin_35756130的博客 582

YOLOV8多模态(可见光+红外光目标检测任务,基于Ultralytics官方代码实现)

torch 2.3.1 torchvision 0.18.1 Python 3.8.19 tensorrt 8.5.3.1DroneVehicle数据集下载地址DroneVehicle 数据集由无人机采集的 56,878 张图像组成,其中一半是 RGB 图像,其余是红外图像。我们为这 5 个类别制作了丰富的注释,其中包含定向边界框。其中,汽车在 RGB 图像中有 389,779 个注释,在

Mjy的博客 7585

三维重建之条纹投影结构光(三)——相位展开优化与多频外差实践

本文深入探讨了三维重建中条纹投影结构光技术的核心环节——相位展开优化。针对传统路径跟踪法存在的误差传播与路径依赖问题,重点解析了多频外差法的原理与优势,并通过详细的C++代码实践,展示了如何利用三频外差法实现鲁棒、高精度的相位展开,从而获得连续的绝对相位图,为后续三维点云生成奠定坚实基础。

weixin_29074295的博客 531

Qt 开发实战:从零打造一个跨平台串口调试助手

本文带你从零开始,使用 Qt6 + C++ 开发一个具备**串口扫描、参数配置、数据收发、十六进制支持、日志保存**等功能的轻量级串口调试助手,并在虚拟串口环境下完成联调测试。QMessageBox::critical(this, "错误", "打开串口失败:" + serial->errorString());QMessageBox::critical(this, "错误", "发送失败:" + serial->errorString());Linux:将用户加入 `dialout` 组 |

nihaoyilian的博客 350

避坑指南:ESP32S3驱动INMP441麦克风时的常见硬件冲突与解决方案

本文详细解析了ESP32S3驱动INMP441麦克风时常见的硬件冲突问题,包括GPIO资源冲突、电源噪声、I2S时钟同步等,并提供了实用的解决方案和优化策略。通过实测数据和代码示例,帮助开发者快速排查和解决音频设备开发中的疑难问题,提升系统稳定性和音频质量。

embedding5hiker的博客 942

告别第三方工具!手把手教你用Qt打造专属串口调试助手,实现多指令快捷发送与界面布局管理

本文详细介绍了如何使用Qt框架开发自定义串口调试助手,解决第三方工具的痛点问题。通过Qt的信号槽机制和属性系统,实现多指令快捷发送、动态界面布局管理等核心功能,提升嵌入式设备调试效率。文章包含完整的开发流程、代码示例和性能优化技巧,帮助开发者打造专属的串口调试工具。

weixin_28740299的博客 360

雷达系统仿真——非相参累积和相参累积检测

非相参累积和相参累积检测 在雷达回波检测中,在特殊情况下,才会根据单个脉冲来进行检测判决。通常,雷达会从每个目标接收几个到几百个成串脉冲,在做出判决之前,要先对脉冲串进行处理。对脉冲串进行处理的方法有5种: 相参累积(Coherent Integration); 非相参累积(Nocoherent Integration); 二进制累积; 累计检测; 反馈累积器。 1 非相参累积 也叫“检波后累积”,或者“视频累积”(Video Integration),比检波前累积更容易完成,因为不需要保存回波的相位。

little_soldier的专栏 1万+

EMS案例:BMS传导发射超标整改案例

BMS作为新能源汽车的关键部件,其EMC性能直接影响整车的安全性和可靠性。本文通过一个实际的传导发射整改案例,详细展示了从问题定位、分析到解决方案实施的全过程。希望这些经验能够为从事类似产品设计的工程师提供有价值的参考,在未来的产品开发中避免类似问题,设计出更加可靠、稳定的BMS产品。EMC设计是一门结合理论与实践的艺术,只有通过不断积累经验、深入理解电磁场理论,并紧密结合实际应用场景,才能在复杂的电磁环境中设计出鲁棒性强的电子产品。

m0_56451176的博客 272

QT串口调试助手:从零构建一个功能完备的工业级工具

本文详细介绍了如何使用QT开发一个功能完备的工业级串口调试助手。从开发环境搭建、串口通信基础到核心功能实现,包括自动检测串口、参数配置、数据收发优化等,提供了完整的代码示例和实用技巧。文章还分享了界面优化、打包部署及工业现场实际项目经验,帮助开发者快速构建高效可靠的QT串口调试工具。

weixin_26976635的博客 393

AI原生SaaS应用的自动化运维体系构建

随着ChatGPT掀起的AI原生应用浪潮,越来越多SaaS(软件即服务)产品开始以"AI优先"的方式设计——从用户交互到核心功能,都深度依赖机器学习模型(如推荐算法、智能客服)、实时数据流(如用户行为分析)和弹性算力(如大模型推理)。这类应用的运维需求与传统SaaS完全不同:传统运维像"修水管",哪里漏了补哪里;AI原生运维则像"照顾会成长的宠物",需要实时感知模型状态、数据变化和流量波动,主动调整资源。

AI天才研究院 1080

掌控串口调试:SSCom跨平台工具从入门到精通指南

SSCom作为一款专为Linux和Mac系统打造的开源串口调试助手,凭借其轻量设计与强大功能,已成为嵌入式开发与物联网调试的必备工具。本文将系统讲解如何利用SSCom建立稳定的串口连接、高效收发数据、解决常见通信问题,帮助开发者从零开始掌握串口调试全流程,显著提升设备调试效率。 ## 一、SSCom工具准备与环境配置 ### 1.1 系统兼容性与安装要求 SSCom支持主流Linux发行版(内

gitblog_00653的博客 612

决策变量乘积项的线性化

介绍了决策变量相乘情况下的线性化,并用案例进行线性化演示,其中针对连续变量相乘的情况介绍了McCormick包络的近似线性化方法

Linshaodan520的博客 1843

全功能tgbot/Telegram机器人多功能有后台版源码

trx兑换 闪兑 关键字监控 群管 usdt监控 余额查询 推广分享 等几乎常见的tg机器人功能都有。全功能tgbot/telegram机器人多功能有后台版源码-打包好的可以直接上手。

百创科技 2702
上一篇: 从零开始实现自己的串口调试助手(4) -实现自动发送 / 时间显示
下一篇: 从零开始实现自己的串口调试助手(6) -换行问题
mx_jun
博客等级 码龄5年 1605粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值