当前位置: 首页 > news >正文

QT之问题解决记录1:上下位机通信中断而不自知

问题背景

在工业控制系统中,上下位机通过串口通信是一种常见的架构模式。下位机(通常是嵌入式设备)按照预定协议发送数据,上位机(通常是PC端应用程序)接收并解析这些数据,然后在用户界面上进行显示。

问题描述

在实际开发中,我发现了一个潜在的问题:当上下位机之间的通信意外中断时,上位机界面无法及时察觉这一情况。这意味着:

  1. 用户界面显示的数据可能长时间保持不变

  2. 系统无法及时报警或采取恢复措施

  3. 操作人员可能误认为系统仍在正常运行

解决方案

为了解决这个问题,我们设计了一个简单而有效的通信状态监测机制:

  1. 状态指示灯:在用户界面上添加一个通信状态指示灯

  2. 定时检测:使用QT的定时器功能,每5秒检查一次串口缓冲区

  3. 状态判定

    • 如果检测周期内收到数据,指示灯显示绿色(通信正常)

    • 如果检测周期内未收到数据,指示灯显示红色(通信中断)

代码实现

//头文件中
extern void setLED(QLabel* label, qint16 color, qint16 size); // 具体实现见博文【QT界面LED指示灯-绘制一个LED灯】private slots:void serialPort_readyRead();void get_serial_data();
private:Ui::MainWindow *ui;QSerialPort *serial;QTimer *serial_timer;QTimer *serial_status_timer;//构造函数中
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{    //串口serial = new QSerialPort(this);  connect(serial, &QSerialPort::readyRead, this,   &MainWindow::serialPort_readyRead);//初始化串口定时器serial_timer = new QTimer(this); connect(serial_timer, SIGNAL(timeout()), this, SLOT(get_serial_data()));//初始化用于检测无线串口状态的定时器serial_status_timer = new QTimer(this);connect(serial_status_timer, &QTimer::timeout, this, [this](){setLED(ui->label_led4_1, 1, 16); //无线指示灯红});
}void MainWindow::serialPort_readyRead()
{serial_timer->start(60);QByteArray data = serial->readAll();serial_buffer.append(data);// 重置无线状态定时器serial_status_timer->stop();serial_status_timer->start(5000); // 5秒后触发超时setLED(ui->label_led4_1, 2, 16); // 无线指示灯绿
}void MainWindow:: get_serial_data()
{serial_timer->stop();qDebug()<<"串口接收数据serial_buffer:"<<serial_buffer;// 重置无线状态定时器serial_status_timer->stop();serial_status_timer->start(5000); // 5秒后触发超时setLED(ui->label_led4_1, 2, 16); //无线指示灯绿// 处理数据包...
}

http://www.dtcms.com/a/327942.html

相关文章:

  • react+redux+toolkit来实现公共数据的处理-对比vuex
  • 深度学习日志及可视化过程
  • 【机器学习深度学习】归一化层
  • Java 编程每日一题:实现一个简易的 LRU 缓存
  • JavaSE:数据类型与变量
  • 13-docker的轻量级私有仓库之docker-registry
  • 网络安全第1—2天笔记
  • 【19】万集科技——万集科技嵌入式,校招 一面,二面,面试问答记录
  • 数据分析与可视化
  • Unity数据可视化图表插件XCharts
  • CS2服务器是何方神圣
  • 21.Linux HTTPS服务
  • imx6ull-驱动开发篇20——linux互斥体实验
  • mimiconda+vscode
  • Ceph的FileStore存储引擎详解
  • Ceph放置组(PG)详解
  • 石头剪刀布手势识别数据集-3,100 张图片 智能游戏系统 人机交互界面 教育娱乐应用 手势识别技术研究 实时视频分析 移动端AI应用
  • 8 反向引用
  • cartographer 后端优化流程
  • 渗透测试现已成为 CISO 战略的核心
  • @RequestMapping接收文件格式的形参(方法参数)
  • 数字孪生赋能全场景智慧化:从水利工厂到城市治理的综合解决方案
  • Akamai字符串解混淆
  • RSA各种密钥格式
  • C++ Rust与Go
  • 【taro react】 ---- 实现 RuiPaging 滚动到底部加载更多数据
  • 使用 Docker 一键部署火山引擎 Sandbox-Fusion,并开放 8182 端口
  • QT6 如何在Linux Wayland 桌面系统抓屏和分享屏幕
  • 力扣hot100 | 双指针 | 283. 移动零、11. 盛最多水的容器、42. 接雨水
  • 2787. 将一个数字表示成幂的和的方案数