实时波形图
实时波形图把设备打印的数值实时画成曲线。调电机 PID、标定传感器、检查 ADC 噪声时,趋势、超调和尖峰一眼就能看出来,不必盯着滚动的文字去读。原来给 VOFA+ 或 Arduino 串口绘图器输出数据的固件,一行都不用改。
每个连接有自己的波形图,位于该连接接收区的上方——曲线下面的文字还在,出现毛刺时可以对照原始输出。打开方式:
- 工具 → 波形图 打开或关闭当前连接的波形图;
- 接收区右键菜单里的波形图,对该连接起同样的作用;
- 波形图工具栏最右侧的 ✕ 关闭波形图。
波形图直接读取收到的字节,与接收区显示文本还是十六进制无关,接收区暂停时也照常绘制。波形图只在打开期间工作:打开之前收到的数值不会补画,关闭时不做任何解析、不占资源。
设备怎样输出数值
在波形图工具栏的第一个下拉框里选择设备发送数值的方式。
文本(CSV、FireWater、Arduino) 是默认格式,几乎所有能 printf 的固件都适用。每个样本输出一行,数值之间用逗号、空格、制表符或分号分隔,行尾是 \n、\r 或 \r\n:
| 设备输出 | 波形图的处理 |
|---|---|
1.5,-0.2,3 或 1.5 -0.2 3 |
三个通道,名为 CH1、CH2、CH3 |
temp:23.5,hum:45.2,pres:1013.2 |
三个通道,名为 temp、hum、pres(Arduino 串口绘图器的写法,冒号两侧有空格也可以) |
pid:100.0,98.6,2.1 |
VOFA+ FireWater:开头唯一的标签是这一行的名字而不是通道名,所以是 CH1 到 CH3 三个通道 |
Motor started 或 12:30:45 boot ok |
不是样本,作为普通日志跳过 |
所以 STM32 的速度环可以输出 printf("%.2f,%.2f,%.2f\r\n", target, speed, pwm);,Arduino 程序可以写 Serial.print("temp:"); Serial.print(t); Serial.print(",hum:"); Serial.println(h);。调试日志可以照常从同一个端口输出:凡是含有非数字内容的行都不进波形图。带标签时,每个标签第一次出现就成为一个通道;某一行可以缺少部分标签(曲线在那里断开);标签与裸数值混在一起的行(如 a:1,2,b:3)直接跳过,不去猜测。12:30 这样的时间不会被当成标签。
JustFloat(VOFA+) 适合直接发送二进制的固件:每个通道一个小端 32 位 float,每帧以 00 00 80 7F 四个字节结尾。单片机不用做格式化,几 kHz 的输出也不吃力:
float frame[3] = {angle, speed, current};
static const uint8_t tail[4] = {0x00, 0x00, 0x80, 0x7F};
HAL_UART_Transmit(&huart1, (uint8_t *)frame, sizeof frame, 10);
HAL_UART_Transmit(&huart1, tail, sizeof tail, 10);
从数据流中途接入或丢了字节时,波形图会自己重新找到帧边界;连接打开后的第一帧用于对齐,不绘制。
正则表达式 适合无法修改的输出格式,例如 T=23.5C H=45%。在格式旁边出现的输入框里写正则表达式:
- 每个捕获组是一个通道,命名组的名字就是通道名:
T=(?<T>[-\d.]+).*H=(?<H>[-\d.]+)得到 T 和 H 两个通道; - 没有捕获组时,行内每一处匹配都是一个通道:
-?\d+\.?\d*会画出这一行里的所有数字。
表达式无效时文字变红,悬停提示会说明错在哪里。
切换格式会清空波形图,因为旧样本与新的数据流对不上。每个波形图最多 32 个通道。
查看曲线
- 横轴:样本序号按样本计数,固件按固定频率输出时最准确,不受线路传输时序影响,与 VOFA+ 和 Arduino 绘图器一致;时间显示从开始绘图算起的秒数,按数据到达的时间计。串口数据是一批一批到达的,同一批里的样本会均匀分布在这段间隔内。
- 显示范围:旁边的下拉框可选 100 到 50,000 个样本,时间轴下为 1 到 300 秒,以及全部。在图上滚动鼠标滚轮也可以缩放这个范围。
- 纵轴:自动 Y 打开时,纵轴范围跟随可见数据。在图上按住 Ctrl 滚动滚轮可以以指针为中心设定固定范围;关闭自动 Y 时保留当前屏幕上的范围。
- 暂停冻结画面,样本仍在记录。拖动图形可以往回翻看历史,同时也会暂停。双击回到实时并恢复自动 Y。
- 鼠标悬停在图上时,显示该位置每个通道的数值。
- 清除清空所有样本。重新建立连接不会清空,设备复位重连后曲线接着画。
- 弹出把波形图移到独立窗口(标题带连接名),可以拖到第二块屏幕上;关闭这个窗口,波形图回到接收区上方。
波形图下方的状态行显示通道数、每秒样本数、已缓存的样本数,以及「已跳过 N 行非数据」(JustFloat 为「已跳过 N 个错误帧」)。每个连接的波形图保留最近 100,000 个样本,更早的依次丢弃。可见范围里有几万个样本时画面依然流畅,只有一个样本的尖峰也不会被抽稀丢掉。
通道与统计
波形图右侧的表格既是图例也是统计表。每个通道显示当前、均值、最小、最大、峰峰值和标准差,统计范围是当前可见的样本。把曲线缩放或暂停在某一段上,这些数字就只描述这一段:传感器放在基准点时的均值、空闲 ADC 通道的噪声(看标准差)、电源纹波(看峰峰值)。
- 取消勾选某个通道即隐藏其曲线,重新勾选即恢复。
- 双击通道名可以重命名,例如把 CH2 改成
speed_rpm;把名字清空,就恢复数据流里的名字。
用游标测量
打开测量后,在图上单击放置游标 A,再单击放置游标 B;之后的单击移动离得较近的那个游标,右键清除两个游标。读数框显示两个游标的位置,以及每个可见通道在 A、B 处的数值和差值。在时间轴下还会显示两者的时间差 Δt 和 1/Δt(Hz),振荡的周期和频率、阶跃响应的上升时间都能直接从曲线上读出。
保存与分享
- 导出 → 导出 CSV... 保存波形图缓存的全部样本:样本序号、到达时间(秒),以及每个通道一列、以通道名为列名。文件为带 BOM 的 UTF-8,Excel 打开时中文通道名不会乱码。
- 导出 → 保存图片... 把屏幕上的波形图保存为 PNG,便于放进报告或发给同事。
- 波形图的设置按连接随
.spu工程保存:是否打开、格式与表达式、横轴、显示范围、纵轴范围、通道名和隐藏的通道。没有打开工程时,第一个连接的波形图设置保存在本机。样本本身不保存,要留下一次运行的数据请导出 CSV。
回放窗口也能绘制录制文件里的数据:每个端口的视图菜单和右键菜单里都有波形图,无论以什么速度回放,曲线都按录制时的时间间隔绘制。
Free 与 SPU Pro
波形图在 Free 里用于确认它能用在你的设备上:
- 绘制前 2 个通道;其余通道照常解析并列在统计表中,标为 Pro;
- 每次运行共 120 秒绘图时长,所有连接共用,重启 SPU 后重新计算;回放窗口里的绘图不计入。只有收到新样本的秒数才计入,所以在空闲端口上开着波形图不会消耗时长。状态行显示「SPU 免费版:本次运行还可绘图 N 秒」;用完后所有波形图停在最后一帧,仍可查看,直到 SPU 重启;
- 保存图片免费;导出 CSV 和测量需要 SPU Pro。
SPU Pro 没有这些限制,激活后立即生效,无需重启。