一、硬件前提说明
N79xxA / N89xxA 大功率双向源 机身无原生 RS232 串口;如需串口通信只能两种方式:
选配USB 转 RS232 适配器,仪器端插 USB 虚拟 COM(VISA COM 端口)
第三方 GPIB 转 RS232 网关间接转发 SCPI
E36100 BT 系列小功率双向源 部分型号支持背板 RS232 硬件串口;老款低配仅 USB/LAN。
串口本质只是物理传输层,SCPI 指令集和 LAN/GPIB/USB 完全一致,读取 LIST 运行记录(DLOG/ELOG/ 时序抖动)的指令无任何改动,区别只在串口波特率、帧格式配置。
二、第一步:串口通信参数配置(仪器端 SCPI 设置串口)
1. 设置串口通信帧参数(仪器侧)
scpi
! 配置波特率:9600/19200/38400/57600/115200
SYST:COMM:SER:BAUD 115200
! 数据位、校验、停止位:8N1(行业标准)
SYST:COMM:SER:BITS 8
SYST:COMM:SER:PARITY NONE
SYST:COMM:SER:STOP 1
! 查询当前串口参数
SYST:COMM:SER:BAUD?
SYST:COMM:SER:BITS?;PAR?;STOP?
默认出厂大多为 9600.8N1.
2. 串口终止符固定
Keysight SCPI 统一换行终止 n(LF),上位机串口收发必须以n结尾发送每条指令。
三、串口读取三类 LIST 运行记录完整 SCPI 流程
指令和 LAN/GPIB 完全通用,仅收发走 COM 口;分缓存实时读取、读取已存日志文件两种方式。
前置统一初始化(每次上电脚本开头)
scpi
*RST
*CLS
! 清空LIST旧采样缓存
SOUR:LIST:DLOG:CLE
SOUR:LIST:TIM:CLE
! 开启步进时序抖动捕获
SOUR:LIST:TIM:CAPT ON
! 开启LIST内置电压电流采样记录
SOUR:LIST:DLOG:ENAB ON
1、读取 LIST 电压电流 DLOG 采样记录
方式 A:直接读取运行后内存缓存(最快,不存仪器硬盘)
scpi
FORM:DATA ASC ! 串口调试优先ASCII;大数据用BIN二进制
FORM:BORD SWAP ! 二进制字节序对齐PC
! 读取全部采样点V/I数组
SOUR:LIST:DLOG:DATA? 0.MAX
串口会逐行 / 块传回所有时序采样数据。
方式 B:读取仪器内部已自动保存的.dlog 日志文件
scpi
! 读取完整文件内容通过串口输出
MEM:DATA? "INT:LOGlist_run001.dlog"
2、读取 LIST 事件 ELOG 运行记录(启停、OVP/OCP、触发、步骤报错)
scpi
! 查询事件总数
MEM:ELOG:COUN?
! 读取全部事件时间戳+状态
MEM:ELOG:DATA? 0.MAX
! 读取已保存elog文件
MEM:DATA? "INT:LOGlist_event.elog"
3、读取 LIST 步进时间抖动统计与原始数据
scpi
! 原始抖动差值数组
SOUR:LIST:TIM:JIT:DATA? 0.MAX
! 内置统计值
SOUR:LIST:TIM:JIT:MEAN?
SOUR:LIST:TIM:JIT:MAX?
SOUR:LIST:TIM:JIT:MIN?
SOUR:LIST:TIM:JIT:STD?
四、串口二进制大数据传输注意(DLOG 百万采样点)
串口速率上限 115200bps,远慢于 LAN/USB/GPIB;超大采样量极度耗时,建议:
短测试用串口导出;长时间高采样优先 LAN
优先让仪器自动保存到 INT/USB,再读取文件而非实时流式缓存
二进制块传输格式和 VISA 标准一致(# 长度头),上位机必须按块解析,不能按普通字符串逐行读取。
加大串口接收缓冲区、延长读取超时时间。
五、Python 串口完整读取示例(pyserial,无 VISA 也可)
python
运行
import serial
import time
# 打开串口,匹配仪器配置
ser = serial.Serial(
port="COM3",
baudrate=115200.
bytesize=8.
parity=serial.PARITY_NONE,
stopbits=1.
timeout=60 # 长超时适配大数据
)
def scpi_send_recv(cmd):
"""发送SCPI指令,带回车换行"""
ser.write((cmd + "n").encode("ascii"))
return ser.readline().decode("ascii").strip()
# 初始化
scpi_send_recv("*RST;*CLS")
scpi_send_recv("SOUR:LIST:DLOG:CLE")
scpi_send_recv("SOUR:LIST:TIM:CLE")
scpi_send_recv("SOUR:LIST:TIM:CAPT ON")
# 运行列表
scpi_send_recv("SOUR:LIST:RUN")
scpi_send_recv("*WAI")
# 读取DLOG采样数据(ASCII模式)
dlog_data = scpi_send_recv("FORM:DATA ASC;SOUR:LIST:DLOG:DATA? 0.MAX")
print("LIST V/I采样数据:", dlog_data[:500])
# 读取抖动均值
jit_mean = scpi_send_recv("SOUR:LIST:TIM:JIT:MEAN?")
print("步进抖动平均值(s):", jit_mean)
# 读取ELOG事件
event_log = scpi_send_recv("MEM:ELOG:DATA? 0.MAX")
print("运行事件记录:", event_log)
ser.close()
二进制 DLOG 块读取简易框架
python
运行
# 切换二进制模式
scpi_send_recv("FORM:DATA BIN;FORM:BORD SWAP")
ser.write(b"SOUR:LIST:DLOG:DATA? 0.MAXn")
# 手动解析#XX长度头 + 浮点二进制流
raw_bin = ser.read(800000) # 预分配大缓冲
六、USB 虚拟串口特殊场景(N79/N89 常用方案)
N79xxA/N89xxA 无硬件 RS232.USB 连接电脑后会生成VISA COM 虚拟串口,使用逻辑同上:
IO Libraries Suite 识别出 COMx 端口
通信参数依旧 8N1.波特率可忽略(USB 虚拟速率不受硬件串口波特限制)
SCPI 指令 100% 通用,读取 LIST 记录无功能删减。
七、限制与优化方案
速度瓶颈 115200 串口≈14KB/s;百万点 DLOG 可能传输数分钟。 优化:仪器 AUTO 保存日志到内部闪存,串口只下发MEM:DATA?拉取成品文件,比实时缓存流式读取稳定。
容易丢包 不要一次性0.MAX拉取超大点数;采用分块读取:
scpi
SOUR:LIST:DLOG:DATA? 0.20000
SOUR:LIST:DLOG:DATA? 20000.20000
机型不支持串口怎么办 优先 LAN TCPIP;其次 USB VISA;最后 USB 转 RS232 虚拟 COM。
八、故障排查
发送指令无返回:核对波特率、8N1、终止符n、COM 端口号
返回乱码:ASCII/BIN 模式不匹配、字节序FORM:BORD错误
查询抖动 / DLOG 返回空:未开启 CAPT/DLOG 使能、LIST 未完整运行一次
报错-113:机型无 LIST 时序采集功能(低配 E36100)