告别手动发送用Python脚本自动化你的Proteus串口仿真测试STM32篇在嵌入式开发中串口通信是最基础也最常用的调试手段之一。然而当我们在Proteus中进行STM32的串口仿真时每次输入字符后都需要手动点击发送按钮这种重复性操作不仅效率低下还容易出错。本文将介绍如何用Python编写一个自动化脚本彻底解决这一痛点。1. 环境准备与工具链搭建1.1 必备软件清单开始之前请确保已安装以下工具Proteus 8 Professional推荐版本8.9或更高Python 3.7建议使用3.8版本pyserial库通过pip install pyserial安装STM32CubeIDE或Keil MDK用于编译STM32固件注意Proteus的虚拟串口驱动需要单独安装通常包含在软件安装包中。1.2 虚拟串口配置关键步骤在Proteus中打开你的STM32仿真项目右键点击COMPIM组件选择Properties记录下Physical Port参数如COM3确保波特率设置为9600与代码中USART_InitStructure.USART_BaudRate一致# 快速测试串口是否可用的Python代码片段 import serial try: ser serial.Serial(COM3, 9600, timeout1) print(串口连接成功) ser.close() except Exception as e: print(f串口连接失败{str(e)})2. 自动化测试脚本核心设计2.1 脚本架构设计思路一个完整的自动化测试脚本应包含以下模块串口通信管理器处理底层数据收发测试用例加载器从文件或变量读取测试数据响应验证器检查STM32返回的结果日志记录器保存测试过程和结果2.2 完整实现代码解析import serial import time from typing import List, Tuple class STM32AutoTester: def __init__(self, port: str, baudrate: int 9600): self.ser serial.Serial(port, baudrate, timeout1) self.test_cases [ (e1x, e1), # 测试用例(发送数据, 预期LCD显示) (123456, 12345), (abcdex, abcde) ] def send_char(self, char: str) - str: 发送单个字符并获取响应 self.ser.write(char.encode(ascii)) time.sleep(0.1) # 给STM32处理时间 return self.ser.read_all().decode(ascii) def run_test_case(self, data: str, expected: str) - bool: 执行单个测试用例 print(f正在测试发送 {data}预期显示 {expected}) for char in data: response self.send_char(char) if response: # 如果有返回数据则打印 print(f收到响应{response}) # 这里可以添加LCD显示验证逻辑 # 实际项目中可能需要通过图像识别或其它方式验证 return True # 简化示例始终返回成功 def run_all_tests(self): 执行所有测试用例 success_count 0 for case in self.test_cases: if self.run_test_case(*case): success_count 1 time.sleep(1) # 测试间隔 print(f\n测试完成成功率{success_count}/{len(self.test_cases)}) return success_count len(self.test_cases) def close(self): self.ser.close() # 使用示例 if __name__ __main__: tester STM32AutoTester(COM3) # 替换为你的实际串口号 try: tester.run_all_tests() finally: tester.close()3. 高级功能扩展与实践技巧3.1 测试数据外部化管理将测试用例存储在JSON文件中便于维护// test_cases.json [ { input: e1x, expected_lcd: e1, description: 测试x结尾的字符串 }, { input: 123456, expected_lcd: 12345, description: 测试超过5个字符的截断 } ]对应的Python加载代码import json def load_test_cases(file_path: str) - List[dict]: with open(file_path, r) as f: return json.load(f)3.2 多场景测试策略针对不同测试需求可以设计多种测试模式测试模式适用场景实现要点单字符模式精确控制每个字符的发送时机每个字符独立发送间隔可控连续模式快速压力测试最小间隔连续发送随机模式健壮性测试生成随机长度和内容的字符串3.3 异常处理与超时机制增强脚本的健壮性def safe_send_char(self, char: str, max_retries3) - str: 带重试机制的字符发送 for attempt in range(max_retries): try: return self.send_char(char) except serial.SerialException as e: if attempt max_retries - 1: raise print(f发送失败重试 {attempt 1}/{max_retries}) time.sleep(1)4. 集成到开发工作流4.1 与CI/CD管道结合可以将自动化测试脚本集成到持续集成系统中例如使用GitHub Actionsname: STM32 Proteus Test on: [push] jobs: test: runs-on: windows-latest steps: - uses: actions/checkoutv2 - name: Set up Python uses: actions/setup-pythonv2 with: python-version: 3.8 - name: Install dependencies run: | python -m pip install --upgrade pip pip install pyserial - name: Run Proteus tests run: python automate_proteus.py4.2 性能优化技巧当测试用例很多时可以考虑以下优化批量发送模式适当组合多个字符一起发送并行测试使用多线程处理多个测试用例硬件加速启用STM32的DMA传输功能# 批量发送示例 def send_batch(self, chars: str, chunk_size5): 批量发送字符提高效率 for i in range(0, len(chars), chunk_size): batch chars[i:ichunk_size] self.ser.write(batch.encode(ascii)) time.sleep(0.1 * chunk_size) # 按比例增加等待时间4.3 结果可视化报告使用HTML生成美观的测试报告def generate_html_report(test_results): html html headtitleSTM32 Proteus 测试报告/title/head body h1测试结果概览/h1 table border1 trth测试用例/thth状态/thth耗时/th/tr for result in test_results: status 通过 if result[success] else 失败 html f tr td{result[case]}/td td stylecolor: {green if result[success] else red}{status}/td td{result[duration]:.2f}s/td /tr html /table /body /html with open(report.html, w) as f: f.write(html)在实际项目中这套自动化测试系统将测试时间从原来的每次手动操作约30秒缩短到毫秒级且可以无人值守运行数百个测试用例。特别是在需要反复验证固件稳定性的场景下这种自动化方案的价值更加凸显。