核心前提
Keysight N79xxA/N89xxA 双向直流电源没有内置一条 SCPI 指令直接返回 “是否含特殊字符”;流程分两步:
SCPI 完整读出绝对路径字符串(介质 + 目录 + 文件名)
上位机(Python/VISA)对返回字符串做非法特殊字符校验 仪器仅负责输出完整路径文本,字符判断逻辑由客户端实现。
一、SCPI 完整读取序列历史文件绝对路径(DLOG/ELOG)
1. 批量读取全部日志文件名
scpi
! 列出LOG目录所有DLOG/ELOG序列历史文件
MEMory:CATalog? "LOG"
返回样例:"seq_01.dlog","run#2.elog","test>v1.dlog"
2. 单文件读取介质、自定义子目录,拼接完整绝对路径
scpi
*CLS
! 1.查询文件所在存储介质 INT/USB
MEM:FILE:MEDium? "run#2.elog"
! 2.查询ELOG/DLOG自定义子目录
MEM:ELOG:DIRectory?
MEM:DLOG:DIRectory?
路径拼接规则
无自定义子目录:介质:LOG文件名
有自定义子目录:介质:LOG子目录名文件名 示例:INT:LOGSEQ_RUNrun#2.elog
3. 全局日志默认路径读取
scpi
MEM:LOG:MEDium?
MEM:LOG:DIRectory?
二、仪器禁止 / 判定的非法特殊字符清单(仪器固件校验规则)
仪器文件系统兼容规则(和 FAT32 / 嵌入式闪存一致),以下字符属于危险特殊字符,出现会造成读取异常、文件损坏、SCPI 报错-257/-258:
系统禁止路径 / 名字符: / : * ? " < > |
高风险干扰字符:# & @ $ % ^ ( ) [ ] { } ~ (空格、制表、中文全角符号)
控制不可见 ASCII(0~31)
安全仅允许:大小写字母、数字、下划线_、小数点.
三、SCPI+Python 自动化校验完整流程
步骤 1:SCPI 取回全部路径字符串
步骤 2:正则匹配检测特殊字符
步骤 3:尝试读取文件,捕获仪器报错二次验证(强校验)
python
运行
import re
import pyvisa
# 仪器禁止的特殊字符正则模式
INVALID_CHAR_PATTERN = r'[\/:*?"<>|#&@$%^()[]{}~ t一-鿿]'
def check_path_special_char(inst, fname, log_type="ELOG"):
# 1. SCPI读取介质与子目录
if log_type == "ELOG":
media = inst.query("MEM:ELOG:MED?").strip()
subdir = inst.query("MEM:ELOG:DIR?").strip()
else:
media = inst.query("MEM:DLOG:MED?").strip()
subdir = inst.query("MEM:DLOG:DIR?").strip()
# 拼接完整绝对路径
base = f"{media}:\LOG\"
if subdir:
base += subdir + "\"
full_path = base + fname
print(f"完整路径:{full_path}")
# 2. 正则检测特殊字符
bad_matches = re.findall(INVALID_CHAR_PATTERN, full_path)
if bad_matches:
print(f"❌ 路径包含特殊字符:{list(set(bad_matches))}")
else:
print("✅ 路径仅含安全字符")
# 3. 仪器读写强校验(含特殊字符大概率读取出错)
inst.write("*CLS")
inst.query(f'MEM:DATA? "{fname}"')
err_code, err_msg = inst.query("SYST:ERR?").split(',')
if int(err_code) != 0:
print(f"⚠️ 文件访问报错 {err_code}:{err_msg},极大概率特殊字符导致解析失败")
return full_path, bad_matches
# 连接仪器执行
rm = pyvisa.ResourceManager()
inst = rm.open_resource("TCPIP::192.168.1.100::INSTR")
# 读取全部日志文件列表
file_raw = inst.query('MEM:CAT? "LOG"').strip()
file_list = [f.strip('"') for f in file_raw.split(',')]
# 逐个校验每一个序列历史文件路径
for log_file in file_list:
check_path_special_char(inst, log_file, log_type="DLOG")
inst.close()
四、仪器侧辅助校验 SCPI 手段(无判断返回值,靠错误码)
1. 试探性打开文件,非法字符直接抛错误码
scpi
*CLS
MEMory:DATA? "run>v1.dlog"
SYST:ERR?
-257 File format error:路径含非法字符、名称解析失败
-256 File missing:字符错乱导致仪器找不到文件
+0:路径名称解析正常
2. 批量重命名清理特殊字符(修复指令)
scpi
! 将带#特殊字符的文件重命名为安全名称
MEMory:FILE:REName "run#2.elog","run_2.elog"
五、型号差异说明
N79xxA / N89xxA:完整支持MEM:FILE:MED、MEM:DIR、MEM:CAT,错误码标准统一
E36100 BT 小型双向源:无独立 DLOG/ELOG 分支,统一用MEM:LOG:MED?,校验逻辑完全一致
老 N6705B:无自定义子目录DIRectory指令,仅根路径INT:LOG,字符限制相同
六、最佳实践规避特殊字符
自动生成序列日志文件名只用:字母 + 数字 + 下划线
禁止脚本中带入空格、#、>、中文、括号
保存序列 / 日志前先用上述脚本批量预检路径字符