采用C#的chart来画动态曲线图(chart1, chart2, char3, chart4) ,大约每100毫秒收到串口送过来的数据50 个bytes左右
char1的曲线基本上卡死,char2曲线更新缓慢,char3曲线流畅, chart4 曲线能更新正常。 I7 cpu ,32Gb RAM 电脑上测试。
串口送到数据事件后
Invoke(new RecvCOMDataDelegate(UpdateUIData), new object[] { readBytes });
UI 主线程来画4个charts
四个chart的 X轴 用同个long xSeq来叠加,如果用时间戳没足够空间显示,时间戳毕竟太长,
Y轴是来自串口收到的数据。但要求能够动态更新Y轴的最大和最小值。
private void UpdateUIData(byte[] readBytes)
{
xSeq++;
//char1
//char2
//char3
// chart4 for curve W1 , W2
int w1_raw = ...
int w2_raw = ...
chart4W1W2.Series[0].Points.AddXY(xSeq, w1_raw);
chart4W1W2.Series[1].Points.AddXY(xSeq, w2_raw);
//保持100个点
if (chart4W1W2.Series[0].Points.Count > 100)
{
chart4W1W2.Series[0].Points.RemoveAt(0);
}
if (chart4W1W2.Series[1].Points.Count > 100)
{
chart4W1W2.Series[1].Points.RemoveAt(0);
}
//下面是获取W1 曲线Y轴的最大和最小值
DataPoint w1_maxdp = chart4W1W2.Series[0].Points.FindMaxByValue();
DataPoint w1_mindp = chart4W1W2.Series[0].Points.FindMinByValue();
double[] w1s_max = w1_maxdp.YValues;
double[] w1s_min = w1_mindp.YValues;
//下面是获取W2 曲线Y轴的最大和最小值
DataPoint w2_maxdp = chart4W1W2.Series[1].Points.FindMaxByValue();
DataPoint w2_mindp = chart4W1W2.Series[1].Points.FindMinByValue();
double[] w2s_max = w2_maxdp.YValues;
double[] w2s_min = w2_mindp.YValues;
//比较w1 和 w2谁的最小值最小,和谁的最大值最大
axY_min = ((w1s_min[0] < w2s_min[0] ? w1s_min[0] : w2s_min[0]) - 500);
axY_max = ((w1s_max[0] > w2s_max[0] ? w1s_max[0] : w2s_max[0]) + 500);
chart4W1W2.ChartAreas[0].AxisY.Minimum = axY_min;
chart4W1W2.ChartAreas[0].AxisY.Maximum = axY_max;
chart4W1W2.ChartAreas[0].AxisX.Minimum = chart4W1W2.Series[0].Points[0].XValue;
chart4W1W2.ChartAreas[0].AxisX.Maximum = xSeq;
先检查数据格式是否统一,尤其是时间轴数据,如果采集的格式或刻度不一致,容易导致同步问题。
是否没有响应消息循环,导致绘制卡顿。可具体发出卡顿截图和说明帮助判断问题。
我自己试了一下,显示100个点的情况下,每100毫秒更新50个点,是很流畅的,是不是数据处理的时候造成的卡顿呢?
另外你也可以试试不用xSeq++;的方式,使用AddY来实现,chart1.Series[0].Points.AddY(数据);
chart的性能也不算那么差的,我每100毫秒更新500个点,然后chart里显示1000个点,4个chart都能运行,也没有觉得有多卡,也不会出现卡死的情况。有没有可能是你在接收到串口数据时,处理数据的时间过长?
朋友你先单独运行char1那部分试试