项目实战——使用python脚本完成指定OTA或者其他功能的自动化断电上电测试

news2025/1/15 3:47:34

前言

在嵌入式设备的OTA场景测试和其他断电上电测试过程中,有的场景发生在夜晚或者随时可能发生,这个时候不可能24h人工盯着,需要自动化抓取串口日志处罚断电上电操作。
下面的python脚本可以实现自动抓取串口指定关键词,然后触发继电器的主动断电上电操作,具体场景是在我实际开发项目中,有一个静默升级的功能,在夜间静默推送升级功能,需要做下载过程的随机断电防止出现升级过程卡死。

我写了以下的工具,可以捕捉mobxterm上面的日志指定关键字,当扫描到指定关键字进行断电或者上电的测试,完成夜间的随机物理断电测试。

准备工作

  1. 带有ch340串口芯片或者其他串口芯片的继电器模块
    在这里插入图片描述

  2. mobxterm软件

  3. python脚本

代码

python脚本如下,python3环境执行


# *Copyright(C),2025-20xx
# *FileName:  
# *Author:  ljl
# *Version:  
# *Date:  
# *Description:  


import serial
import time
import os

last_mod_time = 0
# 监控的日志文件路径
log_file_path = "[com COM3]  (2025-01-09_152828)  罗的板子(COM3).log"

# 你想要监控的关键词,这里设置为 "percent: 40"
keywords = ["percent: 40"]

# 设置串口参数
serial_port = 'COM2'  # 请根据你的实际情况更改串口号
baud_rate = 9600  # 根据你的设备设置正确的波特率

# 发送十六进制串口指令的函数
def send_hex_serial_command(port, baudrate, hex_command):
    # 打开串口
    ser = serial.Serial(port, baudrate, timeout=1)

    try:
        # 将十六进制字符串转换为字节对象
        command_bytes = bytes.fromhex(hex_command)

        # 发送指令
        ser.write(command_bytes)

    except Exception as e:
        print(f"发生错误: {e}")

    finally:
        # 关闭串口
        ser.close()


def elect_init():
    print("初始化继电器,执行串口上电程序!")
    # 执行串口上电
    hex_command_to_send = "A0 01 00 A1"  # 断电指令
    send_hex_serial_command(serial_port, baud_rate, hex_command_to_send)

    hex_command_to_send = "A0 02 00 A2"  # 断电指令
    send_hex_serial_command(serial_port, baud_rate, hex_command_to_send)

    hex_command_to_send = "A0 03 00 A3"  # 断电指令
    send_hex_serial_command(serial_port, baud_rate, hex_command_to_send)

    hex_command_to_send = "A0 04 00 A4"  # 断电指令
    send_hex_serial_command(serial_port, baud_rate, hex_command_to_send)


# 根据关键词执行串口断电操作
def execute_script():
    print("找到 'percent: 40',执行串口断电程序!")

    # 执行串口断电
    hex_command_to_send = "A0 01 01 A2"  # 请替换为你实际要发送的十六进制指令,用空格分隔每个字节
    send_hex_serial_command(serial_port, baud_rate, hex_command_to_send)
    hex_command_to_send = "A0 02 01 A3"  # 请替换为你实际要发送的十六进制指令,用空格分隔每个字节
    send_hex_serial_command(serial_port, baud_rate, hex_command_to_send)
    hex_command_to_send = "A0 03 01 A4"  # 请替换为你实际要发送的十六进制指令,用空格分隔每个字节
    send_hex_serial_command(serial_port, baud_rate, hex_command_to_send)
    hex_command_to_send = "A0 04 01 A5"  # 请替换为你实际要发送的十六进制指令,用空格分隔每个字节
    send_hex_serial_command(serial_port, baud_rate, hex_command_to_send)


# 监控日志文件的函数
def monitor_log():
    global last_mod_time
    start_time = time.time()  # 获取程序开始时的时间
    print("开始监控日志文件...")

    try:
        while True:
            # 获取文件的最后修改时间
            current_mod_time = os.path.getmtime(log_file_path)

            # 如果文件发生更新(修改时间不同),重新读取并检查文件
            if current_mod_time > last_mod_time:
                last_mod_time = current_mod_time  # 更新最后修改时间

                with open(log_file_path, "r") as log_file:
                    # 从文件开头开始读取
                    for line in log_file:
                        # 检查日志行是否包含关键词
                        for keyword in keywords:
                            if keyword in line:
                                # 计算当前时间与开始时间的间隔
                                elapsed_time = time.time() - start_time
                                print(f"找到关键词 '{keyword}',执行串口指令")
                                print(f"当前时间:{time.strftime('%H:%M:%S', time.gmtime(elapsed_time))},已运行 {elapsed_time:.2f} 秒")
                                execute_script()
                                break

            # 每10秒钟再次执行一次检查
            time.sleep(10)

    except FileNotFoundError:
        print(f"错误: 无法打开日志文件 {log_file_path},文件未找到。")
    except IOError as e:
        print(f"错误: 打开日志文件时发生IO错误: {e}")


if __name__ == "__main__":
    elect_init()  # 初始化继电器
    monitor_log()  # 开始监控日志文件

实验现象

执行脚本后,如果文件不存在会直接打印文件不存在,找到对应关键字和执行相关操作都会有时间打印。
在这里插入图片描述

注意

mobxterm等其他串口工具可以实现自动保存日志,但是日志不会再次刷新,python脚本中需要检测文件编辑时间去再次打开文件获取最新串口数据

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

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

相关文章

电脑分辨率调到为多少最佳?电脑分辨率最佳设置

电脑分辨率是指电脑屏幕上显示的像素点的数量,通常用水平和垂直方向的像素点数来表示,例如19201080。像素点越多,显示的内容就越清晰,但也会占用更多的系统资源和电力。那么多电脑分辨率多少最佳?以及电脑分辨率如何调…

代码随想录算法【Day20】

Day20 二叉搜索树 235. 二叉搜索树的最近公共祖先 理解只要当前节点的值在p和q节点的值的中间,那这个值就是最近的公共祖先,绝对不是次近的,这个题就好做了。 递归法 二叉搜索树本身是有序的,所以不涉及到前中后序的遍历 cl…

【SpringBoot】@Value 没有注入预期的值

问题复现 在装配对象成员属性时,我们常常会使用 Autowired 来装配。但是,有时候我们也使用 Value 进行装配。不过这两种注解使用风格不同,使用 Autowired 一般都不会设置属性值,而 Value 必须指定一个字符串值,因为其…

车联网安全 -- 数字证书到底证明了什么?

在车联网安全--TLS握手过程详解里面,我们了解到握手时,Server会向Client发送Server Certificate,用于证明自己的身份合法,为什么会有这一步呢? 我们回顾一下数字签名的过程: Bob将使用自己的公钥对“Hello…

Elasticsarch:使用全文搜索在 ES|QL 中进行过滤 - 8.17

8.17 在 ES|QL 中引入了 match 和 qstr 函数,可用于执行全文过滤。本文介绍了它们的作用、使用方法、与现有文本过滤方法的区别、当前的限制以及未来的改进。 ES|QL 现在包含全文函数,可用于使用文本查询过滤数据。我们将回顾可用的文本过滤方法&#xf…

【HTML+CSS+JS+VUE】web前端教程-31-css3新特性

圆角 div{width: 100px;height: 100px;background-color: saddlebrown;border-radius: 5px;}阴影 div{width: 200px;height: 100px;background-color: saddlebrown;margin: 0 auto;box-shadow: 10px 10px 20px rgba(0, 0, 0, 0.5);}

Spring Boot 项目自定义加解密实现配置文件的加密

在Spring Boot项目中, 可以结合Jasypt 快速实现对配置文件中的部分属性进行加密。 完整的介绍参照: Spring Boot Jasypt 实现application.yml 属性加密的快速示例 但是作为一个技术强迫症,总是想着从底层开始实现属性的加解密,…

若依前后端分离项目部署(使用docker)

文章目录 一、搭建后端1.1 搭建流程:1.2 后端零件:1.2.1 mysql容器创建:1.2.2 redis容器创建:1.2.3 Dockerfile内容:1.2.4 构建项目镜像:1.2.5 创建后端容器: 二、前端搭建:2.1 搭建流程&#x…

Vue2+OpenLayers使用Overlay实现点击获取当前经纬度信息(提供Gitee源码)

目录 一、案例截图 二、安装OpenLayers库 三、代码实现 关键参数: 实现思路: 核心代码: 完整代码: 四、Gitee源码 一、案例截图 二、安装OpenLayers库 npm install ol 三、代码实现 覆盖物(Overlay&#xf…

Oracle 终止正在执行的SQL

目录 一. 背景二. 操作简介三. 投入数据四. 效果展示 一. 背景 项目中要求进行性能测试,需要向指定的表中投入几百万条数据。 在数据投入的过程中发现投入的数据不对,需要紧急停止SQL的执行。 二. 操作简介 👉需要DBA权限👈 ⏹…

Oopsie【hack the box】

Oopsie 解题流程 文件上传 首先开启机器后,我们先使用 nmap -sC -SV来扫描一下IP地址: -sC:使用 Nmap 的默认脚本扫描(通常是 NSE 脚本,Nmap Scripting Engine)。这个选项会自动执行一系列常见的脚本&am…

V少JS基础班之第四弹

一、 前言 第四弹内容是操作符。 本章结束。第一个月的内容就完成了, 是一个节点。 下个月我们就要开始函数的学习了。 我们学习完函数之后。很多概念就可以跟大家补充说明了。 OK,那我们就开始本周的操作符学习 本系列为一周一更,计划历时6…

【STM32-学习笔记-7-】USART串口通信

文章目录 USART串口通信Ⅰ、硬件电路Ⅱ、常见的电平标准Ⅲ、串口参数及时序Ⅳ、STM32的USART简介数据帧起始位侦测数据采样波特率发生器 Ⅴ、USART函数介绍Ⅵ、USART_InitTypeDef结构体参数1、USART_BaudRate2、USART_WordLength3、USART_StopBits4、USART_Parity5、USART_Mode…

Docker 安装开源的IT资产管理系统Snipe-IT

一、安装 1、创建docker-compose.yaml version: 3services:snipeit:container_name: snipeitimage: snipe/snipe-it:v6.1.2restart: alwaysports:- "8000:80"volumes:- ./logs:/var/www/html/storage/logsdepends_on:- mysqlenv_file:- .env.dockernetworks:- snip…

达梦8-DMSQL程序设计学习笔记1-DMSQL程序简介

1、DMSQL程序简介 DMSQL程序是达梦数据库对标准SQL语言的扩展,是一种过程化SQL语言。在DMSQL程序中,包括一整套数据类型、条件结构、循环结构和异常处理结构等,DMSQL程序中可以执行SQL语句,SQL语句中也可以使用DMSQL函数。 DMSQ…

NLP中常见的分词算法(BPE、WordPiece、Unigram、SentencePiece)

文章目录 一、基本概念二、传统分词方法2.1 古典分词方法2.2 拆分为单个字符 三、基于子词的分词方法(Subword Tokenization)3.1 主要思想3.2 主流的 Subword 算法3.3 Subword 与 传统分词方法的比较 四、Byte Pair Encoding (BPE)4.1 主要思想4.2 算法过…

第三十六章 Spring之假如让你来写MVC——拦截器篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…

PyTorch 深度学习框架快速入门 (小土堆)

PyTorch 深度学习框架快速入门 深度学习框架常用模块数据集存取图片数据处理库 —— PILOS 模块实例 Tensorboard 记录机器学习的过程Transform 进行图像变换数据集的下载DataLoaderModule 自定义网络前向传播卷积层卷积简单应用 最大池化非线性层线性层 简单的整合基于现有网络…

FPGA的 基本结构(Xilinx 公司Virtex-II 系列FPGA )

以Xilinx 公司Virtex-II 系列FPGA 为例,其基本结构由下图所示。它是主要由两大部分组成:可编程输入/输出(Programmable I/Os)部分和内部可配置(Configurable Logic)部分。 可编程输入/输出(I/Os…

【Elasticsearch】批量操作:优化性能

🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程,高并发设计,Springboot和微服务,熟悉Linux,ESXI虚拟化以及云原生Docker和K8s,热衷于探…