采用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;