基于QT的串口调试助手制作

2023-11-11

目录

1、创建文件

2、串口界面制作

3、代码

4、结果

5、改进

6、百度链接


1、创建文件

        创建带有ui界面的qt程序,可以点击文件-新建文件或项目就会出现上面的界面,选这Application(应用程序)创建项目,其中Qt Widgets Application是创建qt部件的应用程序,例如下面的Qt Console Application是创建控制台类型的应用,其他读者想要了解的可以创建后运行了解。

         选择Qt Widgets Application-choose后,出现上述界面,修改名称和创建路径后(点击设为默认的项目路径)点击下一步,剩下的步骤直接点下一步即可。

        项目创建完后,就会生成上图目录所示的文件,其中usart.pro文件是非常重要的,随意更改会出现编译出错的情况,但很多较为复杂的qt程序需要添加库文件的声明,包含路径、预处理器定义,生成目录,输出中间目录等设置,所以在不确定如何添加时可以搜索一下(注意备份,防止修改出错);mainwindow.h是主窗口的头文件,在这里可以添加自己的参数变量等;mainwindow.cpp是程序主要修改的部分;mainwindow.ui是界面编辑文件,可点击进入ui设计界面。

2、串口界面制作

        串口界面的制作主要包括:

        1、label标签类

        2、ComboBox类

        3、Plain text Edit

        4、Pushbutton

        5、Check Box

       以上部件设计简单的串口调试助手如图:

        串口的参数包括端口号、波特率、数据位、校验和停止位等,这里只选择图上这五项作为串口的主要配置,界面包括label标签类、QComboBox下拉框类、QPushButton按键类、QCheckBox单选框和QPlainTextEdit纯文本编辑类五种。端口号的下拉框可以通过程序读取到串口添加入下拉框内,其他下拉框(波特率、数据位、校验、停止位)可以在ui界面双击下拉框进行编辑。这样一个简单的串口调试的界面就完成了。

3、代码

        (1)修改usart.pro文件

        在usart.pro文件的如图位置插入 QT += serialport 这一句话,只有这样qt才能使用串口协议进行数据传输和接收。

        (2)修改mainwindow.h文件

         在mainwindow.h头文件中,添加如上几行代码,QTime和QTimer是qt中定时器的文件,QMessageBox是信息提示的文件,QSeralPort和QserialPortInfo是串口协议文件。

        (3)修改mainwindow.cpp文件

        mainwindow.cpp中主要包括串口的获取、串口参数设置、串口接收和发送数据处理等。

        部分代码如下:(完整代码备注邮箱、qq或微信,发送百度链接)

    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(timer_serialsendandreceiveEvent()));
    timer->start(10);

        利用定时器的timeout触发串口助手的接受事件 ,可以有效的避免数据量过大导致的阻塞问题,并且可以修改timer定时器的触发时间,更加贴合数据传输过程。

QList<QSerialPortInfo> comList = QSerialPortInfo::availablePorts();//获取可用串口列表

    ui->cBox_SerialPortNum->clear();//清空item,避免搜索后重复添加
    ui->cBox_SerialPortBaud->clear();
    ui->CBox_SerialPortcheck->clear();
    ui->cBox_SerialPortStopBit->clear();
    ui->cBox_SerialPortDataNum->clear();

    if(comList.isEmpty())//若没有可用串口,则发送警告
    {
        QMessageBox::warning(this,"Waring!","There's no avalible COM to use, plese check your serialport!");
    }
    else//将可用串口显示到comboBox上以供选择
    {
        for(int i = 0; i < comList.size(); i ++)
        {
            ui->cBox_SerialPortNum->addItem(comList[i].portName());
            //ui->cBox_SerialPortNum->addItem(comList[i].description());//设备描述
        }
    }

    QStringList baudRateList = QStringList() << "1200" << "2400" << "4800"
                                             << "9600" << "14400" << "19200" << "38400" << "43000" << "57600"
                                             << "76800" << "115200" << "128000" << "230400" << "256000" <<"460800"
                                             << "921600" << "1382400";
    QStringList parityList = QStringList() << "无" << "奇校验" << "偶校验";
    QStringList stopBitsList = QStringList() << "1" << "1.5" << "2";
    QStringList dataBitsList = QStringList() << "8" << "7" << "6" << "5";

    ui->cBox_SerialPortBaud->addItems(baudRateList);
    ui->CBox_SerialPortcheck->addItems(parityList);
    ui->cBox_SerialPortStopBit->addItems(stopBitsList);
    ui->cBox_SerialPortDataNum->addItems(dataBitsList);
    ui->cBox_SerialPortBaud->setCurrentIndex(10);//设置115200为默认选项

      上述代码主要是获取到串口端口号并将其添加入下拉框、填充其他下拉框的内容,为后续工作做准备。

 QByteArray bufferHex = str_buffer_Serial.toHex();//转换成hex
    bufferHex=bufferHex.toUpper();//转换成大写
    QString str_buffer1;

    if(ui->cb_rechex->isChecked())//16进制显示
    {
      str_buffer1 = QString(bufferHex);//转换成字符
      for(int i = str_buffer1.count(); i > 0; i = i-2)
      {
        str_buffer1.insert(i," ");
      }
    }
    else//字符形式显示
    {
       str_buffer1 = QString(str_buffer_Serial);
    }
    if(ui->opencolse->text()=="关闭串口")
    {
       ui->SerialPortDataShow->insertPlainText(str_buffer1);
       ui->SerialPortDataShow->moveCursor(QTextCursor::End);
    }
    str_buffer1=ui->SerialPortDataShow->toPlainText();
    if(str_buffer1.size()>10000) ui->SerialPortDataShow->clear();

    str_buffer_Serial.clear();
//qDebug("getdata");
    qint64 byteLen_now = serialbasic->bytesAvailable();
    if(byteLen_now < 0)
    {
        return;
    }
    //qDebug()<<"当前缓存长度"<<byteLen_now<<endl;

    buffer_Serial+=serialbasic->readAll();

    QByteArray bufferHex = buffer_Serial.toHex();//转换成hex
    bufferHex=bufferHex.toUpper();//转换成大写
    str_buffer_Serial+=buffer_Serial;

    //ui->SerialPortDataShow->append(str_buffer_Serial);
    //QString str_buffer = QString(buffer_Serial);

    QString str_buffer = QString(bufferHex);//转换成字符
    for(int i = str_buffer.count(); i > 0; i = i-2)
    {
      str_buffer.insert(i," ");
    }

    buffer_Serial.clear();

4、结果

        因为手头没有硬件作为测试,所以使用的Vspd虚拟串口+sscom串口调试助手作为调试的方案。

        将两端串口的参数调整一致后,测试最终结果如图,经过一段时间的测试,效果良好,并且可以进行双向通信并转化成16进制传输 。

5、改进

        由于制作时间较短,无法进行例如画图的工作,附加数据库保存数据,修改串口通信为无线通信,与下位机进行互联通信等功能,之后考虑会添加代码。有需要可以联系博主。

        qq:3125201632    备注:逆流

        以上成果属于个人积累,有任何不足之处还望谅解,欢迎批评指正,我们一起学习进步。有任何问题,即使跟博主联系,欢迎欢迎!

6、百度链接

(求关注!!!)

链接:https://pan.baidu.com/s/16drrESWyYx32mprD2oxevA?pwd=55xk 
提取码:55xk

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于QT的串口调试助手制作 的相关文章

随机推荐

  • 复旦微魔方FM33FR0xx——FL库笔记-定义

    fm33fr0xx h的定义 一 时钟定义 define RCHF INITIAL CLOCK 8000000 内部RC高频震荡器 8M define RCMF CLOCK 4000000 内部RC 4M振荡器 define LPOSC C
  • 判断考生成绩等级(switch case语句练习)

    判断考生成绩等级 1 考生成绩控制在 0 100 2 成绩 90 100 优 成绩 80 90 良 成绩 70 80 可 成绩 60 70 一般 成绩 0 60 不及格 要求使用switch语句 不能使用if语句 class SwitchT
  • 华为OD机试 - 区间交叠问题(Java)

    题目描述 给定坐标轴上的一组线段 线段的起点和终点均为整数并且长度不小于1 请你从中找到最少数量的线段 这些线段可以覆盖柱所有线段 输入描述 第一行输入为所有线段的数量 不超过10000 后面每行表示一条线段 格式为 x y x和y分别表示
  • 爬虫取中间文本_10 个爬虫工程师必备的工具

    阅读文本大概需要 6 分钟 工欲善其事必先利其器的道理相信大家都懂 而作为经常要和各大网站做拉锯战的爬虫工程师们 则更需要利用利用好身边的一切法器 以便更快的攻破对方防线 今天我就以日常爬虫流程 给大家介绍十款工具 相信大家掌握之后 必定能
  • 用java有理数类包含加减乘除_用java具体代码实现分数(即有理数)四则运算

    用java具体代码实现分数 即有理数 四则运算 1 背景 Java老师布置了一个关于有理数运算的题目 因为参考书上有基本代码 所以自己主要是对书上代码做了一点优化 使其用户交互性更加友好以及代码封装性更强 2 说明 分数也称作有理数 是我们
  • 解空间

    目录 一 解空间 二 解空间的相对性 三 解空间结构 四 解空间结构的相对性 五 对象空间 六 对象空间和解空间的关系 1 对象空间等于解空间 2 解空间是对象空间的子空间 3 解空间是对象空间的子空间构成的集合 4 解空间是对象空间 或其
  • 求二叉树的深度/求二叉树的节点数

    1 求二叉树的深度 高度 思路 递归解法 1 如果二叉树为空 则树的深度为0 递归返回条件 2 如果二叉树不为空 二叉树深度 max 左子树节点个数 右子树节点的个数 1 代码如下 二叉树节点的数据结构 class treeNode pub
  • C语言,判断二维字符数组是否存在回文字符串 例如:char a[] [10]={“asd“,“asa“,“werew“,“yuyu“};

    判断二维字符数组是否存在回文字符串 例如 char a 10 asd asa werew yuyu 提示存在回文字符串 回文字符串对称 思路 循环二维字符数组 判断每一个字符串是否是回文字符串 回文字符串使用单独函数 2 1 循环二维数组
  • C++14中返回类型推导的使用

    使用C 14中的auto返回类型 编译器将尝试自动推导 deduce 返回类型 namespace int xx 1 auto f return xx return type is int const auto f3 return xx r
  • 如何不冒昧的问妹子年龄又能清楚的知道她多大呢?Python来告诉你。

    前言 昨天 公司一个程序员过生日 一大帮子单身老爷们儿聚餐 可怜 所以大家呼朋唤友 有女朋友的带着闺蜜 朋友 好说歹说 准备一起聚聚 顺便给大家互相介绍 下 说不定 哎嘿有互相看对眼的呢 结果 人家小姐姐问你猜她多大 给程序员猜小姐姐年龄的
  • SSDA-YOLO:新的YOLOv5改进方法——用于跨域目标检测的半监督域自适应YOLO方法

    文章转载来源于自动驾驶之心 作者汽车人 域自适应目标检测 DAOD 旨在缓解跨域差异导致的传输性能下降 然而 大多数现有的DAOD方法由计算密集的两级检测器主导 这不是工业应用的首选 本文提出了一种新的基于半监督域自适应YOLO SSDA
  • Bailian3709 2进制转化为3进制【进制转换】

    题目链接 2进制转化为3进制 总时间限制 1000ms 内存限制 65536kB 描述 输入一个2进制的数 要求输出该2进制数的3进制表示 在3进制的表示中 只有0 1 2三种符号 输入 第1行是测试数据的组数n 后面跟着n行输入 每组测试
  • 彻底弄懂CommonJS和AMD/CMD!

    JS中的模块规范 CommonJS AMD CMD 如果你听过js模块化这个东西 那么你就应该听过或CommonJS或AMD甚至是CMD这些规范咯 我也听过 但之前也真的是听听而已 现在就看看吧 这些规范到底是啥东西 干嘛的 一 Commo
  • Ubuntu 搜狗输入法显示繁体,一直不显示简体

    1 问题 在ubuntu系统下 安装好sogou输入法之后 用了一段时间之后 输入拼音之后 老是出现繁体字 很烦 原因 可能误触了繁体简体开关 2 解决办法 按住shift 不放 同时 按下ctrl 和F键 即可 有些博客和评论说这种方式在
  • linux各种文件系统挂载总结

    mount语法 mount t 类型 o 挂接方式 源路径 目标路径 t 选项 iso9660 光盘或光盘镜像 msdos DOS fat16文件系统 vfat Windows 9x fat32文件系统 ntfs Windows NT nt
  • Redis核心知识点

    Redis面试精选 1 redis 简介 简单来说 redis 就是一个数据库 不过与传统https download csdn net download liyangxueit 12307486库不同的是 redis 的数据是存在内存中的
  • ++k与k++区别 和双目运算符结合

    最近在写代码时发现了这样一个错误 题目如下 链接 Hdu 1027 关键代码如下 int k 1 while next permutation s begin s end if k m 注意 问题就出在这里 for int i 0 i
  • C#编程和网络编程入门

    文章目录 一 用C 编写一个命令行 控制台程序 二 用C 编写一个简单的Form窗口程序 参考 一 用C 编写一个命令行 控制台程序 要求 用C 编写一个命令行 控制台hello world程序 实现如下功能 在屏幕上连续输出50行 hel
  • Qt的MVC模型/视图编程(一)——理论知识

    一 为什么需要MVC模型 视图 MVC模型 视图架构是用于实现对大量数据的存储 处理及其显示 如下图所示 没用MVC存储数据的是图片中的上半部分 用了MVC处理数据后的是图片的下半部分 1 MVC模型 视图的作用 a 模型 数据 与视图 显
  • 基于QT的串口调试助手制作

    目录 1 创建文件 2 串口界面制作 3 代码 4 结果 5 改进 6 百度链接 1 创建文件 创建带有ui界面的qt程序 可以点击文件 新建文件或项目就会出现上面的界面 选这Application 应用程序 创建项目 其中Qt Widge