2013-04-22 96 views
0

我有一个应用程序,每次温度变化时都从串口获取温度数据。该值存储在一个变量中,并显示在一个文本框中。 我想在图表中显示温度与时间的关系。 我已经设置了以下图表,但我不知道从哪里开始更新温度线与每秒的时间。图动态更新

InitializeComponent(); 
     //Chart 
     chart1.ChartAreas.Add("areas"); 
     chart1.ChartAreas["areas"].AxisX.Minimum = 0; 
     chart1.ChartAreas["areas"].AxisX.Interval = 1; 
     chart1.ChartAreas["areas"].AxisY.Minimum = 0; 
     chart1.ChartAreas["areas"].AxisY.Maximum = 250; 
     chart1.ChartAreas["areas"].AxisY.Interval = 10; 
     chart1.ChartAreas["areas"].AxisX.Title = "Time [s]"; 
     chart1.ChartAreas["areas"].AxisY.Title = "Temperature [°C]"; 
     chart1.Series.Add("Temperature"); 
     chart1.Series["Temperature"].Color = Color.Red; 
     chart1.Series["Temperature"].ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; 
     chart1.Titles.Add("Extruder Temperature"); 

     //this two lines are only to see something in the graph 
     chart1.Series["Temperature"].Points.AddXY(0, 20); 
     chart1.Series["Temperature"].Points.AddXY(1, 50); 
    } 

我想我需要更新的“点”和“价值”(0,20),通过变量替换值,但如果我这样做,我在图中,我只有一点无法显示以前的值。作为初学者,我将不胜感激。

+0

您使用的是Windows Forms还是WPF? – jle 2013-04-22 07:26:43

+0

@jle我正在使用Windows窗体 – FeliceM 2013-04-22 07:51:22

回答

1

你获得了新的数据后,只需添加另一个数据点: 只给你一个想法(因为你还没有发布的数据接收方法):

OnSerialReceive() 
{ 
    var temp = serialport.read(); 
    var time = (int)stopwatch.Elapsed.TotalSeconds; 
    chart1.Series["Temperature"].Points.AddXY(time, temp); 
} 

是的,只要你得到真实的数据输入到你的图表中,你会想要删除你的假数据。假数据令人困惑。

+0

我想他还需要删除第一个'Datapoint',以使图形不会出现'ZoomOut',这样看起来就像在Windows任务管理器中看到的用于RAM使用的运行图形。 – 2013-04-22 07:59:45

+0

谢谢你的答案。我正在采取你建议的方向。 – FeliceM 2013-05-08 14:18:13

2

另一种方法(每秒刷新一次)是使用BackgroundWorker。这个问题给出example。本质上,你开始一个后台线程,每隔一定时间更新视图。

private BackgroundWorker _bw; 

.... 
    InitializeComponent(); 
    _bw = new BackgroundWorker 
    { 
     WorkerReportsProgress = true, 
     WorkerSupportsCancellation = true 
    }; 
    _bw.DoWork += bw_DoWork; 
    _bw.ProgressChanged += bw_ProgressChanged; 
    _bw.RunWorkerCompleted += bw_RunWorkerCompleted; 

    _bw.RunWorkerAsync ("Hello to worker"); 
    if (_bw.IsBusy) _bw.CancelAsync(); 
    } 

    private void bw_DoWork (object sender, DoWorkEventArgs e) 
    { 

     if (_bw.CancellationPending) { e.Cancel = true; return; } 
     var dataPoints = YourConnectToSerialPortAndGetDataFunction(); 
     _bw.ReportProgress (dataPoints); 
     Thread.Sleep (1000); 

    e.Result = dataPoints; // This gets passed to RunWorkerCompleted 
    } 

    private void bw_RunWorkerCompleted (object sender, 
            RunWorkerCompletedEventArgs e) 
    { 

} 

    private void bw_ProgressChanged (object sender, 
            ProgressChangedEventArgs e) 
    { 
//UPDATE YOUR LABEL 
chart1.Series["Temperature"].Points.AddXY(0, 20); 
     chart1.Series["Temperature"].Points.AddXY(1, 50); 
    }