常用设计模式(embeded Qt)

news/2025/2/23 14:36:30

常用设计模式

  1. 观察者模式(Observer Pattern)

    • 应用场景:传感器数据更新、UI状态同步。
    • 实现方式:通过QT的信号槽机制(本质是发布-订阅模式)自动实现。例如:
      connect(sensor, &Sensor::dataUpdated, uiWidget, &UIWidget::updatePlot);
      
  2. 策略模式(Strategy Pattern)

    • 应用场景:动态切换动平衡算法(如影响系数法、试重法等)。
    • 实现方式
      class BalanceAlgorithm { virtual void calculate() = 0; };
      class InfluenceCoefficient : public BalanceAlgorithm { ... };
      class TrialWeight : public BalanceAlgorithm { ... };
      
  3. 状态模式(State Pattern)

    • 应用场景:设备状态管理(空闲、校准、测量、错误)。
    • 实现方式
      class DeviceState { virtual void handle() = 0; };
      class MeasuringState : public DeviceState { ... };
      
  4. 工厂模式(Factory Pattern)

    • 应用场景:硬件驱动创建(不同型号传感器适配)。
    • 示例
      Sensor* SensorFactory::createSensor(SensorType type) {
          switch(type) {
              case TYPE_A: return new LaserSensor();
              case TYPE_B: return new PiezoelectricSensor();
          }
      }
      
  5. 适配器模式(Adapter Pattern)

    • 应用场景:兼容不同通信协议(CAN/RS485/BLE)。
    • 示例:将第三方BLE库接口适配为统一硬件抽象层接口。

嵌入式QT系统通常采用分层架构,以下为动平衡仪器的典型架构:

1. 硬件抽象层(HAL)
  • 职责:隔离硬件差异
  • 组件
    class DataAcquisition {
    public:
        virtual QVector<double> readVibrationData() = 0;
    };
    
    class CANDataAcquisition : public DataAcquisition { ... };
    
2. 业务逻辑层(Core Service)
  • 模块划分
    • 信号处理模块:FFT分析、滤波算法
      class SignalProcessor {
      public:
          void applyFFT(QVector<double>& timeDomain);
      };
      
    • 动平衡算法模块:实现核心数学计算
    • 数据持久化模块:SQLite存储历史记录
3. 用户界面层(QT UI)
  • 实现方式
    • MVVM模式:通过QAbstractItemModel派生类实现数据绑定
    • 自定义控件:实时频谱图、三维轴心轨迹显示
      class SpectrumPlot : public QCustomPlot { ... };
      
4. 通信层
  • 实现要点
    class DeviceCommunicator : public QObject {
        QSerialPort m_port;
        void sendCommand(QByteArray cmd) {
            m_port.write(cmd);
        }
    };
    

嵌入式QT特有技术要点

  1. 实时性保障

    • 使用QThread分离UI线程与数据处理线程
    • 通过优先级控制确保关键任务:
      QThread* dataThread = new QThread;
      dataThread->start(QThread::TimeCriticalPriority);
      
  2. 资源优化

    • 禁用QT不必要的模块(如webkit)
    • 使用QVarLengthArray替代动态数组
    • 预分配内存池避免运行时分配
  3. 硬件交互

    • 直接寄存器操作(需封装为QT类):
      class GPIO : public QObject {
          volatile uint32_t* m_reg;
      public:
          void setHigh() { *m_reg |= 0x01; }
      };
      
  4. 跨平台适配

    • 使用QT条件编译处理平台差异:
      #ifdef Q_OS_LINUX
          #include <linux/can.h>
      #elif defined(Q_OS_WIN)
          // Windows CAN API
      #endif
      

典型代码结构示例

project/
├── hal/              # 硬件抽象层
│   ├── can_driver.cpp
│   └── sensor_adapter.cpp
├── core/            # 核心算法
│   ├── fft_processor.cpp
│   └── balance_algorithm.cpp
├── ui/              # QT界面
│   ├── mainwindow.cpp
│   └── customplot.cpp
├── communication/   # 通信协议
│   └── modbus_handler.cpp
└── third_party/     # 第三方数学库
    └── eigen/

性能优化技巧

  1. 数学计算优化

    • 使用Eigen库模板表达式避免临时对象
    • 启用NEON指令集加速(ARM平台):
      add_definitions(-mfpu=neon -mfloat-abi=hard)
      
  2. 绘图优化

    • 使用OpenGL加速的QOpenGLWidget
    • 采用增量更新代替全量重绘:
      void SpectrumPlot::appendData(double value) {
          m_data.removeFirst();
          m_data.append(value);
          update();  // 局部更新
      }
      
  3. 低功耗管理

    • 利用QT电源管理信号:
      connect(qApp, &QGuiApplication::applicationStateChanged, 
              [](Qt::ApplicationState state){
                  if(state == Qt::ApplicationSuspended)
                      enterLowPowerMode();
              });
      


http://www.niftyadmin.cn/n/5863482.html

相关文章

SpringBoot 如何统一 API 响应格式

一、为什么要统一 在真实项目开发中&#xff0c;你是否遇到过这些问题&#xff1f; 前端需要为不同接口编写差异化处理逻辑错误信息格式五花八门&#xff0c;定位问题困难全局异常处理缺失导致敏感信息泄露 在前后端分离架构中&#xff0c;统一的 API 响应格式是提升协作效率…

详解Virtualhome环境搭建教程 | 智能体

&#x1f64b;大家好&#xff01;我是毛毛张! &#x1f308;个人首页&#xff1a; 神马都会亿点点的毛毛张 本篇文章毛毛张想分享的是搭建VitrualHome环境的教程&#xff0c;这个内容在国内很少有人在做&#xff0c;或者做的时候分享的教程比较少&#xff0c;毛毛张在此记录…

趣味数学300题1981版-十五个正方形

分析&#xff1a;移动两根变成11个正方形很简单&#xff1a; 移动4根变成15个正方形&#xff0c;分析&#xff1a; 一个田字格包含5个正方形&#xff0c;若要15个正方形需要3个田字格&#xff0c;如果3个田字格完全不重合&#xff0c;需要6*318根火柴。如果合并正方形的边&…

AI大模型学习(二): LangChain(二)

Langchain构建聊天机器人 安装依赖 pip install langchain_community Chat History:它允许聊天机器人"记住"过去的互动,并在回应后续问题时考虑他们 代码 # 创建模型 from langchain_core.messages import HumanMessage from langchain_core.prompts import ChatP…

如何保存爬虫获取商品评论的数据?

保存爬取的评论数据是爬虫项目中的一个重要环节。根据需求&#xff0c;你可以选择将数据保存为本地文件&#xff08;如CSV、JSON、TXT&#xff09;&#xff0c;或者存储到数据库&#xff08;如MySQL、MongoDB等&#xff09;。以下是几种常见的数据保存方式及其示例代码。 1. 保…

ChatGPT平替自由!DeepSeek-R1私有化部署全景攻略

一、DeepSeek-R1本地部署配置要求 &#xff08;一&#xff09;轻量级模型 ▌DeepSeek-R1-1.5B 内存容量&#xff1a;≥8GB 显卡需求&#xff1a;支持CPU推理&#xff08;无需独立GPU&#xff09; 适用场景&#xff1a;本地环境验证测试/Ollama集成调试 &#xff08;二&a…

python: 并发编程 (Concurrent Programming) Simple example

# encoding: utf-8 # 版权所有 2025 ©涂聚文有限公司™ # 许可信息查看&#xff1a;言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班嗎 # 描述&#xff1a;并发编程 (Concurrent Programming) pip install mysql.connector # Author : geovindu,Geovin Du 涂…

力扣每日一题【算法学习day.132】

前言 ###我做这类文章一个重要的目的还是记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&#xff01;&#xff01;&#xff01; 习题 1.统计相似字符串对的数目 题目链…