006-第一代光电小工具(二)

news2024/12/25 12:22:35
头图

第一代光电小工具(二)

文章目录

  • 第一代光电小工具(二)
    • 项目介绍
    • 串口
    • QCustomPlot 部分
      • 开启OpenGl
      • 更新曲线
    • 总结一下

关键字: QtQmlQCustomPlot串口QSerialPort

项目介绍

欢迎来到我们的 QML & C++ 项目!这个项目结合了 QML(Qt Meta-Object Language)和 C++ 的强大功能,旨在开发出色的用户界面和高性能的后端逻辑。

在项目中,我们利用 QML 的声明式语法和可视化设计能力创建出现代化的用户界面。通过直观的编码和可重用的组件,我们能够迅速开发出丰富多样的界面效果和动画效果。同时,我们利用 QML 强大的集成能力,轻松将 C++ 的底层逻辑和数据模型集成到前端界面中。

在后端方面,我们使用 C++ 编写高性能的算法、数据处理和计算逻辑。C++ 是一种强大的编程语言,能够提供卓越的性能和可扩展性。我们的团队致力于优化代码,减少资源消耗,以确保我们的项目在各种平台和设备上都能够高效运行。

无论您是对 QML 和 C++ 开发感兴趣,还是需要我们为您构建复杂的用户界面和后端逻辑,我们都随时准备为您提供支持。请随时联系我们,让我们一同打造现代化、高性能的 QML & C++ 项目!

重要说明☝

☀该专栏更新到第三代软件开发时将转为收费专栏

串口

接着上篇,我们接着聊聊我这个小工具中还用到了什么Qt的内容。

当你不需要追求极致的效率时,Qt自带的串口类QSerialPort是一个方便且易于使用的工具,可以满足大多数串口通信需求。以下是关于QSerialPort的一些丰富信息:

  1. 打开和配置串口:使用QSerialPort类可以轻松打开和配置串口连接。通过设置波特率、数据位、停止位、奇偶校验等参数,可以适应不同的串口设备。
  2. 读取和写入数据:QSerialPort提供了读取和写入数据的函数。你可以使用read()函数读取串口接收缓冲区中的数据,使用write()函数向串口发送数据。此外,还有一些其他函数用于读取特定数量的字节、等待特定事件等。
  3. 事件驱动的串口通信:QSerialPort使用Qt的事件驱动机制,可以监听串口接收缓冲区中的数据到达、串口错误发生等事件。你可以通过继承QSerialPort并重写虚拟函数void QIODevice::readyRead()来处理接收到的数据。
  4. 支持流控制:QSerialPort支持硬件流控制(RTS/CTS、DTR/DSR)和软件流控制(XON/XOFF)。你可以通过设置相应的属性实现流控制功能。
  5. 跨平台支持:QSerialPort是跨平台的,它支持在多个操作系统上使用,如Windows、Linux和macOS等。这使得你可以轻松地开发可移植的串口通信应用程序。
  6. 错误处理:QSerialPort提供了一些函数和信号来处理串口通信中的错误情况。你可以使用error()函数获取最后发生的错误代码,使用errorString()函数获取错误的人类可读描述。
  7. 示例和文档:Qt官方提供了丰富的示例代码和文档,帮助你理解和使用QSerialPort类。你可以查阅Qt的官方文档,其中包含详细的函数说明和示例代码。

总之,Qt自带的串口类QSerialPort提供了一个便捷的接口来进行串口通信。无论是简单的串口数据收发还是更复杂的串口协议交互,QSerialPort都能满足大部分需求,并提供跨平台的支持。

初始化串口及遍历可用串口代码如下:

/**
 * @brief MainWindow::initSerialPort
 * 初始化串口
 */
void MainWindow::initSerialPort()
{
    if(!m_serialPort)                                                                               //判断串口是否被初始化
    {
        m_serialPort = new QSerialPort();                                                           //初始化串口
        QObject::connect(m_serialPort,&QSerialPort::readyRead,this,&MainWindow::readSerialData);
    }
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())                          //枚举当前可用串口
    {
        //自动查找可用的串口
        QSerialPort serial;
        serial.setPort(info);
        if(serial.open(QIODevice::ReadWrite))
        {
            ui->comboBox_serialPory->addItem(serial.portName());
            serial.close();
        }
    }
}

打开串口及基本设置代码如下

/**
 * @brief MainWindow::openSerialPort
 * @return
 * 初始化串口
 */
bool MainWindow::openSerialPort()
{
    if(m_serialPort)
    {
        m_serialPort->setPortName(ui->comboBox_serialPory->currentText());                          //设置串口名称
        if(m_serialPort->open(QIODevice::ReadWrite))                                                //打开串口模式为读写模式
        {
            m_serialPort->setBaudRate(QSerialPort::Baud115200);                                     //设置串口波特率为115200
            m_serialPort->setDataBits(QSerialPort::Data8);                                          //设置串口数据位为8位
            m_serialPort->setParity(QSerialPort::NoParity);                                         //设置串口没有校验位
            m_serialPort->setStopBits(QSerialPort::OneStop);                                        //设置串口停止位为1位
            m_serialPort->setFlowControl(QSerialPort::NoFlowControl);                               //设置串口流控为无
            return true;
        }
        else
        {
            QMessageBox::warning(this,"警告","打开串口失败,请重试",QMessageBox::Ok);                   //弹窗警告
            return false;
        }
    }
    else
    {
        return false;
    }
}

如果最求极致,那就手写串口驱动,跳过系统内核,把部分物业逻辑封装到驱动中,这样可能会有更高的效率,不过目前我在这小工具中怎么使用就可以了。

QCustomPlot 部分

上一篇中已经分享了目前QCustomPlot包含的内容,单纯对QCustomPlot感兴趣的,可以直接去哪里看博主遇到的坑,

这部分在第一代中其实没有啥实用的分享,也是第一次使用,很多都是不是理想,只是用在小工具上,在当时的环境下,恰好满足罢了,后面经过在正式项目对QCustomPlot有了稍微那么一丢丢的研究,会分享更多,同时也会包含到QCustomPlot的专栏里面。这里可以分享几段代码

开启OpenGl

通过看博主控件的命名应该也会发现了吧,我开始真实是打算用QChart 的,不过是在没有解决数据卡顿问题。这里开启OpenGL 直接调用QCustomPlot现成的接口就可以,不过要注意这个不是一定好使,等后面就发会发了。

    ui->widget_chart->setOpenGl(true);
    ui->widget_chart_2->setOpenGl(true);
    ui->widget_chartShow->setOpenGl(true);
    ui->widget_chartShow_2->setOpenGl(true);

更新曲线

这个很重要,而且最好建议这么做,就是找一个定时器专门用来重新绘制曲线,代码如下

/**
 * @brief MainWindow::slot_upDateQCustomplotPainter
 * 定时刷新QCustomPlot界面
 */
void MainWindow::slot_upDateQCustomplotPainter()
{
    if(ui->tabWidget_mainFrame->currentIndex() == 0)
    {
        ui->widget_chart->xAxis->setRange(m_dataIndex,840,Qt::AlignRight);                 // 更新x轴范围
        ui->widget_chart_2->xAxis->setRange(m_dataIndex,840,Qt::AlignRight);               // 更新x轴范围
        ui->widget_chart->yAxis->rescale(true);                                             // 设置Y轴状自适应
        ui->widget_chart_2->yAxis->rescale(true);                                           // 设置Y轴状自适应
        ui->widget_chart->replot(QCustomPlot::rpQueuedReplot);                              // 刷新界面显示
        ui->widget_chart_2->replot(QCustomPlot::rpQueuedReplot);                            // 刷新界面显示
    }

    if(ui->tabWidget_mainFrame->currentIndex() == 1)
    {
        ui->widget_chartShow->yAxis->rescale(true);                                         // 设置Y轴状自适应
        ui->widget_chartShow_2->yAxis->rescale(true);                                       // 设置Y轴状自适应
        ui->widget_chartShow->replot(QCustomPlot::rpQueuedReplot);                          // 刷新界面显示
        ui->widget_chartShow_2->replot(QCustomPlot::rpQueuedReplot);                        // 刷新界面显示
    }
}

好了,小工具涉及到的内容就分享到这里。

总结一下

最终大家看到的小工具是一个可以满足当时使用的小软件,但是这个已经不是这个小工具最开始的样子了,最开的小工具只有连接串口,显示数据,而且还是用的QChart,在发现使用QChart无法解决卡顿问题后,换了QCustomPlot模块,后期为了方便标记数据,有做了数据类型标记,就是通过不同颜色的曲线来确定数据类型。

在最开始进需要展示一条曲线,后期发现一条曲线解决不了问题,所以吧后台的参考数据也一并取出。用作后期数据分析。

所以,做项目不是一次性的,需要我们不断的调整,以适应当下的使用需求,也不是一层不便的,各位小伙伴不比为了频繁的需求变化为烦恼,同时通过不断的改进自己的代码质量,也是对自己的一种提升和总结。


博客签名2021

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

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

相关文章

Ubuntu系统下载及安装教程

史上最全最新Ubuntu安装教程(图文) - 知乎 (说明:本教程介绍的是安装DeskTop版的系统) 1.官网下载镜像 官方网址: https://ubuntu.com/#download进入官网后会有最新版本的镜像下载地址,如果需要下载最新版本,直接点…

2023-09-18 LeetCode每日一题(打家劫舍 III)

2023-09-18每日一题 一、题目编号 337. 打家劫舍 III二、题目链接 点击跳转到题目位置 三、题目描述 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦…

【C++】构造函数初始化列表 ③ ( 构造函数 的 初始化列表 中 为 const 成员变量初始化 )

文章目录 一、构造函数 的 初始化列表 中 为 const 成员变量初始化1、初始化 const 常量成员2、错误代码示例 - 没有初始化常量成员3、正确代码示例 - 在初始化列表中初始化常量成员4、完整代码示例 构造函数初始化列表 总结 : 初始化列表 可以 为 类的 成员变量 提供初始值 ;…

TCP IP网络编程(六) 基于UDP的服务器端、客户端

文章目录 一、理解UDP1.UDP套接字的特点2.UDP内部工作原理3.UDP的高效使用 二、实现基于UDP的服务器端、客户端1.UDP中的服务端和客户端没有连接2.UDP服务器端和客户端均只需要一个套接字3.基于UDP的数据I/O函数4.基于UDP的回声服务器端、客户端5.UDP客户端套接字的地址分配 三…

【Java】java: 无效的标记: -parameters

问题描述 maven項目,原来使用jdk8的版本,现在改成jdk7的版本,结果报错: java: 无效的标记: -parameters 原因分析 解决方法 删掉下图所示的-parameters参数 参考文章 https://www.cnblogs.com/lovezzb/p/10072854.html

英伟达 nvidia 官方code llama在线使用

新一代编程语言模型Code Llama面世:重新定义编程的未来 随着人工智能和机器学习技术的迅速发展,我们现在迎来了一款革命性的大型编程语言模型——Code Llama。该模型是基于Llama 2研发的,为开放模型中的佼佼者,其性能达到了行业领…

零基础学前端(四)1. 重点讲解 CSS:盒子模型、样式选择器

1. 该篇适用于从零基础学习前端的小白 2. 初学者不懂代码得含义也要坚持模仿逐行敲代码,以身体感悟带动头脑去理解新知识 3. 初学者切忌,不要眼花缭乱,不要四处找其它文档,要坚定一个教授者的方式,将其学通透&#xff…

基于GBDT+Tkinter+穷举法按排队时间预测最优路径的智能导航推荐系统——机器学习算法应用(含Python工程源码)+数据集(二)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境Pycharm 环境Scikit-learnt 模块实现1. 数据预处理2. 客流预测1)创建并保存模型2)损失函数3)测试集测试4)自定义特征并预测 3. 百度地图API调用1)申请密…

许少辉博士后挂站联谊《乡村振兴战略下传统村落文化旅游设计》河北站——2023学生开学季辉少许

许少辉博士后挂站联谊《乡村振兴战略下传统村落文化旅游设计》河北站——2023学生开学季辉少许

【大规模 MIMO 检测】基于ADMM的大型MU-MIMO无穷大范数检测研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

Winform中DataGridView中实现一个单元格增加多个操作按钮

1.表格名称&#xff1a;dgv&#xff1b;操作列名称&#xff1a;ColOperate 2.相关代码如下&#xff1a; private void Load(object sender, EventArgs e){//初始化调用 前提是表格先填充好数据//循环遍历添加每行的控件for (int i 0;i < dgv.Rows.Count; i){MulAutoBtnEdi…

【最新!企知道AES加密分析】使用Python实现完整解密算法

文章目录 1. 写在前面2. 过debugger3. 抓包分析4. 断点分析5. Python实现解密算法 1. 写在前面 最近华为各方面传递出来的消息无不体现出华为科技实力与技术处于遥遥领先的地位。所以出于好奇想要了解一下咱们国内这些互联网科技企业有哪些技术专利&#xff0c;于是就有了这篇文…

怎么防止360安全卫士修改默认浏览器?

默认的浏览器 原先选项是360极速浏览器&#xff08;如果有安装的话&#xff09;&#xff0c;我这里改成了Chrome。 先解锁 才能修改。

相伴六年,Smartbi与荣耀共建数据化运营新生态

“从 2018 年到 2023 年&#xff0c;整整六年的时间里面&#xff0c;我们从最开始使用Smartbi功能里最朴素的真自助能力&#xff0c;到现在做了BI、AI融合&#xff0c;过去六年业务的发展离不开Smartbi的大力支持&#xff0c;Smartbi与荣耀自有平台能力打通融合&#xff0c;相辅…

SpringBoot2.0(mybatis-plus常见的增删改查和分页)

目录 一&#xff0c;mybatis-plus常见注解二&#xff0c;创建一个工具类和启动类三&#xff0c;创建实体类四&#xff0c;创建mapper接口五&#xff0c;创建service接口和impl类六&#xff0c;创建配置类七&#xff0c;创建controller八&#xff0c;使用测试工具测试增删改查和…

Linux编译安装dig9.18

Linux编译安装dig9.18 背景查看dig版本 编译安装dig安装依赖包下载dig压缩包解压编译安装创建软链接 结果验证 背景 Centos7的dig版本是9.11&#xff0c;体验9.18新版本的功能特性。 例如&#xff1a; 使用yaml格式输出。 # 使用yaml格式输出 dig yaml google.com查看dig版本…

3、ARM寄存器组织

ARM寄存器组织 1、寄存器 概念 寄存器是处理器内部的存储器&#xff0c;没有地址 作用 一般用于暂时存放参与运算的数据和运算的结果 分类 包括通用寄存器、专用寄存器、控制寄存器 2、ARM寄存器 注&#xff1a; 在某个特定的模式下&#xff0c;只能使用当前模式下的…

什么测试自动化测试?

什么测试自动化测试&#xff1f; 做测试好几年了&#xff0c;真正学习和实践自动化测试一年&#xff0c;自我感觉这一个年中收获许多。一直想动笔写一篇文章分享自动化测试实践中的一些经验。终于决定花点时间来做这件事儿。 首先理清自动化测试的概念&#xff0c;广义上来讲&a…

用Python判断是否为闰年并计算生肖年

1 问题 润平年以及生肖是新的一年到来我们应该了解的信息。那么如何利用python程序计算快速计算该年为什么年&#xff1f; 2 方法 利用if条件判断语句实现。 代码清单 1 year eval(input(请输入咨询的年份:))if (year % 4 0 and year %100 ! 0) or year % 400 0: print(…

递归视角下

def listSum(numbers): if not numbers: return 0 else: (f, rest) numbers return f listSum(rest)myList (1, (2, (3, (4,None))))total listSum(myList)print(total) while循环何时退出&#xff1f; 恐怕是while循环技巧所在&#xff0c;即选择恰…