在信号发生器自动化测试框架的开发和运行过程中,常见的错误涉及硬件通信、脚本逻辑、数据处理和系统兼容性等多个层面。以下是典型错误分类及其解决方案,结合实际案例和优化建议:
Connection refused
、
TimeoutError
或数据传输中断。
ping
或
telnet
测试网络连通性。
python
import
socket
from
time
import
sleep
def
connect_with_retry(ip, port=5025, max_retries=3
):
for
attempt
in
range(max_retries):
try:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(2)# 设置超时
sock.connect((ip, port))
return
sock
except
(socket.timeout, ConnectionRefusedError)
as
e:
sleep(2
** attempt)# 指数退避
if
attempt == max_retries -
1:
raise
RuntimeError(f"Failed to connect to
{ip}:
{str(e)}")
*IDN?
)确认执行状态。
pythondef set_and_verify(driver, cmd, expected_response):driver.conn.send(cmd.encode())# 清空缓冲区(避免残留数据)while True:data = driver.conn.recv(1024).decode()if expected_response in data:break
yaml# test_params.yamlfrequency_sweep:start: 100kHzstop: 10MHzstep: 100kHz
pythonimport yamlwith open("test_params.yaml") as f:params = yaml.safe_load(f)["frequency_sweep"]
python
from
concurrent.futures
import
ThreadPoolExecutor
def
test_worker(ip, freq):
driver = SignalGeneratorDriver(ip)# 每个线程独立实例
driver.set_frequency(freq)
with
ThreadPoolExecutor(max_workers=4)
as
executor:
for
ip
in
["192.168.1.101",
"192.168.1.102"]:
executor.submit(test_worker, ip,
1e6)
python
from
threading
import
Lock
log_lock = Lock()
def
safe_log(message):
with
log_lock:
with
open("test.log",
"a")
as
f:
f.write(message +
"n")
pythondef validate_sampling(freq, sample_rate):if sample_rate <2 * freq:raise ValueError(f"Sample rate {sample_rate}Hz <2*{freq}Hz (Nyquist)")
pythondef read_data_with_retry(driver, expected_size):data = b""while len(data)
pythondef verify_amplitude(actual, expected, tolerance_percent=5):return abs(actual - expected) <= expected * tolerance_percent / 100
python
import
numpy
as
np
from
scipy
import
stats
def
check_normality(samples):
_, p_value = stats.normaltest(samples)
return
p_value >
0.05# p>0.05认为符合正态分布
vs
/
)报错。
os.path
或
pathlib
处理路径。
pythonfrom pathlib import Pathconfig_path = Path("config") / "test_params.yaml"
venv
或
conda
)隔离依赖。
requirements.txt
或
Pipfile
)。
text# requirements.txtpyvisa==1.12.0numpy==1.24.3
pythonimport logginglogging.basicConfig(level=logging.INFO,format="%(asctime)s - %(threadName)s - %(levelname)s - %(message)s")
python
from
contextlib
import
contextmanager
@contextmanager
def
managed_device(ip):
driver = SignalGeneratorDriver(ip)
try:
yield
driver
finally:
driver.set_frequency(1e3)# 恢复默认频率
driver.conn.close()
python
from
queue
import
Queue
ip_queue = Queue()
for
ip
in
["192.168.1.101",
"192.168.1.102"]:
ip_queue.put(ip)
def
worker():
ip = ip_queue.get()
driver = SignalGeneratorDriver(ip)
# 测试逻辑...
ip_queue.task_done()
python
import
select
def
non_blocking_read(driver, timeout=1
):
ready = select.select([driver.conn], [], [], timeout)
if
ready[0]:
return
driver.conn.recv(4096)# 增大缓冲区
return
None
| 错误类型 | 预防措施 |
|---|---|
| 连接不稳定 | 实现指数退避重试、验证物理连接、配置防火墙白名单 |
| 参数硬编码 | 使用配置文件(YAML/JSON)集中管理参数 |
| 并发资源竞争 | 线程隔离、加锁机制、连接池 |
| 数据采集错误 | 参数校验、动态缓冲区、统计验证 |
| 跨平台问题 |
使用
pathlib
处理路径、虚拟环境隔离依赖
|
| 调试困难 | 结构化日志、上下文管理器、自动化回滚 |
通过系统性地识别和解决这些常见错误,可显著提升信号发生器自动化测试框架的稳定性和可维护性,适应从实验室研发到大规模产线测试的多样化需求。