目录

序言:

一、功能需求

二、运行环境

三、完整代码

四、代码解析

五、应用场景

六、执行效果


序言:

上一篇文章中,我们实现了使用NI-MAX和EasyPower控制可编程电源,完成简单的上电/断电流程(上一篇博客传送门)。本篇则更进一步,实现基于python+pyvisa让程序在循环上电的同时,通过 ADB 连接 Android 设备,并执行 ping 测试,用来判断设备在上电后是否能正常联网。

一、功能需求

目标:Python 自动化测试:结合 PyVISA 控制电源 + ADB 网络检测的稳定性测试

  1. 循环控制可编程电源上电 → 设定电流限制与额定电压

  2. 等待电压稳定后,执行 adb shell ping 指令测试联网

  3. 失败日志(如:不通、超时、ADB 连接失败)记录到本地文件

  4. 支持长时间无人值守运行

二、运行环境

  • 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("设备连接已关闭")

四、代码解析

  1. 日志记录函数

    • log_failure 会将每次 ping 失败的原因记录到 ping_fail.log 中,

    • 例如:

      上电第 5 次: www.baidu.com 不通 上电第 8 次: www.baidu.com 超时 
  2. ADB Ping

    • 使用subprocess.run()

      调用系统命令 adb shell ping

    • 捕获输出并判断是否存在 "device not found" 等错误信息。

    • 失败会调用 log_failure 记录。

  3. PyVISA 控制电源

    • ResourceManager用于枚举并连接 VISA 设备。

    • write发送 SCPI 命令,如 psu.write("VOLTage 13.1")

      设置输出电压。

  4. 循环执行测试

    • 循环 1000 次(可自行修改)。

    • 每次上电 → 等待 → ping → 下电 → 重复。

五、应用场景

  • 车载设备稳定性测试

  • Android 设备网络连通性检测

  • 自动化实验室供电控制

  • 长时间无人值守测试

六、执行效果

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐