GNUplot管道传输原始数据时多曲线绘图不同步问题求解
问题解决方案
问题根因
你遇到的同步问题本质是两个错误导致的:
- plot指令同时调用了两个inline数据源(
"-"和""),但你每次只输出了1个结束符e,gnuplot始终在等待第二个数据源的结束标记,只能用上次缓存的数据补全第二条曲线,导致两次采样的数据拼到了同一帧里 - C程序默认的标准输出缓冲机制会把输出拆分成多段传给管道,gnuplot收到不完整的指令/数据就提前触发渲染
最优修复方案
按照下面的步骤修改即可,修改后刷新速率可轻松达到10Hz以上,远满足1Hz的要求:
步骤1:禁用C程序标准输出缓冲
在C程序main函数最开头加入一行代码,完全禁用stdout的缓冲,确保所有输出会直接写入管道:
setvbuf(stdout, NULL, _IONBF, 0);
步骤2:调整输出结构,补充结束符
- 所有
set开头的配置指令只需要在程序启动时输出一次,不需要每次刷新重复输出,减少不必要的传输开销 - 每次刷新时输出完plot指令和采样数据后,连续输出2个
e结束符,分别对应两个inline数据源的结束标记
正确输出示例
程序启动后仅输出一次全局配置:
set terminal wxt noraise background rgb 'sea-green' set autoscale set title "Collected Data" set yrange[-0.5:4.0] set xrange[0:128]
后续每次拿到新采样数据,输出单帧内容如下:
plot "-" u (1.000000*$1):2 with lines lw 3 lc rgb 'dark-red', "" u (1.000000*$1):3 with lines lw 3 lc rgb 'dark-blue' 0.750 3.204 3.211 1.750 0.150 0.139 2.750 0.127 0.118 3.750 0.109 0.098 4.750 0.091 0.085 5.750 0.081 0.074 e e
执行命令不需要修改,依然为:
./cprog | gnuplot
内容的提问来源于stack exchange,提问作者baetis
相关产品推荐
相关产品推荐

