【03】鼎阳Siglent SPD1168X 可编程电源的远程控制实例03—基于 Python + PyVISA + ADB 的Android自动上电与网络检测脚本
目标:Python 自动化测试:结合 PyVISA 控制电源 + ADB 网络检测的稳定性测试。log_failure 会将每次 ping 失败的原因记录到 ping_fail.log 中,write发送 SCPI 命令,如 psu.write("VOLTage 13.1")每次上电 → 等待 → ping → 下电 → 重复。(如:不通、超时、ADB 连接失败)记录到本地文件。失败会调用 log
目录
序言:
上一篇文章中,我们实现了使用NI-MAX和EasyPower控制可编程电源,完成简单的上电/断电流程(上一篇博客传送门)。本篇则更进一步,实现基于python+pyvisa让程序在循环上电的同时,通过 ADB 连接 Android 设备,并执行 ping 测试,用来判断设备在上电后是否能正常联网。
一、功能需求
目标:Python 自动化测试:结合 PyVISA 控制电源 + ADB 网络检测的稳定性测试
-
循环控制可编程电源上电 → 设定电流限制与额定电压
-
等待电压稳定后,执行 adb shell ping 指令测试联网
-
将 失败日志(如:不通、超时、ADB 连接失败)记录到本地文件
-
支持长时间无人值守运行
二、运行环境
-
Python 版本:3.8+
-
依赖库:pip install pyvisa
-
工具:
-
Siglent SPD 系列可编程电源
-
ADB 工具(已配置到系统环境变量)
-
USB 数据线连接 Android 设备
-
三、完整代码
import pyvisa
import time
import subprocess
# 定义上电次数(如果是循环上电可将其作为循环计数)
power_on_count = 1
# 日志记录函数
def log_failure(iteration, host, message):
log_line = f"上电第 {iteration} 次: {host} {message}\n"
with open("ping_fail.log", "a", encoding="utf-8") as log_file:
log_file.write(log_line)
# 通过 adb shell 执行 ping 指令的函数
def adb_ping_host(host, iteration):
print(f"正在通过 adb shell ping {host} ...")
try:
result = subprocess.run(["adb", "shell", "ping", "-c", "4", host],
capture_output=True,
text=True,
timeout=10)
# 检查 ADB 是否未连接或有错误
adb_output = result.stdout + result.stderr
if ("device not found" in adb_output or
"no devices" in adb_output or
"error: more than one device" in adb_output):
log_failure(iteration, host, "ADB连接失败")
print(f"ADB连接失败,无法 ping {host}:\n{adb_output}")
return
if result.returncode != 0:
log_failure(iteration, host, "不通")
print(f"adb shell ping {host} 不通:\n{result.stdout}")
else:
print(result.stdout)
except subprocess.TimeoutExpired:
log_failure(iteration, host, "超时")
print(f"adb shell ping {host} 超时!")
except Exception as e:
log_failure(iteration, host, f"异常:{e}")
print(f"adb shell ping {host} 出错: {e}")
# 创建 VISA 资源管理器
rm = pyvisa.ResourceManager()
# 列出所有可用设备
devices = rm.list_resources()
print("可用设备列表:", devices)
if not devices:
print("❌ 未找到任何设备,请检查 USB 连接!")
exit()
# 尝试连接设备,注意替换为实际设备地址
psu = rm.open_resource("USB0::0xF4EC::0x1410::SPD1XEAD3R0062::INSTR")
print(f"已连接设备: {devices[0]}")
# 设置 VISA 参数
psu.timeout = 2000 # 2秒超时
psu.read_termination = '\n'
psu.write_termination = '\n'
# 发送查询命令并等待响应
psu.write("*IDN?")
time.sleep(0.1) # 等待设备响应
response1 = psu.read()
print("设备信息:", response1)
# 重复执行上电流程 1000 次
for i in range(1, 1000):
print(f"\n========= 第 {i} 次上电 =========")
# 上电流程
psu.write("OUTPut CH1,ON")
time.sleep(45) # 等待设备响应
psu.write("CH1:CURRent 7.8")
time.sleep(3) # 等待设备响应
psu.write("VOLTage 13.1")
time.sleep(3) # 等待设备响应
# 等待电压稳定 4 秒
print("等待4秒,确保上电电压稳定为 13.1V...")
time.sleep(4)
# 通过 adb shell 依次对目标地址执行 ping 指令,并记录失败情况
# adb_ping_host("192.168.0.1", i)
# adb_ping_host("192.168.0.28", i)
adb_ping_host("www.bing.com", i)
time.sleep(4)
# 关闭 CH1 输出
psu.write("OUTPut CH1,OFF")
time.sleep(1) # 等待设备响应
psu.close()
print("设备连接已关闭")
四、代码解析
-
日志记录函数
-
log_failure 会将每次 ping 失败的原因记录到 ping_fail.log 中,
-
例如:
上电第 5 次: www.baidu.com 不通
上电第 8 次: www.baidu.com 超时
-
-
ADB Ping
-
使用subprocess.run()
调用系统命令 adb shell ping
-
捕获输出并判断是否存在 "device not found" 等错误信息。
-
失败会调用 log_failure 记录。
-
-
PyVISA 控制电源
-
ResourceManager用于枚举并连接 VISA 设备。
-
write发送 SCPI 命令,如 psu.write("VOLTage 13.1")
设置输出电压。
-
-
循环执行测试
-
循环 1000 次(可自行修改)。
-
每次上电 → 等待 → ping → 下电 → 重复。
-
五、应用场景
-
车载设备稳定性测试
-
Android 设备网络连通性检测
-
自动化实验室供电控制
-
长时间无人值守测试
六、执行效果
更多推荐
所有评论(0)