2013-09-11 5 views
3
 public void DrawingPulseData(byte[] data) 
     { 

      // Make sure that the curvelist has at least one curve 
      if (PulseControl.GraphPane.CurveList.Count <= 0) 
       return; 

      // Get the first CurveItem in the graph 
      LineItem curve = PulseControl.GraphPane.CurveList[0] as LineItem; 
      if (curve == null) 
       return; 

      // Get the PointPairList 
      IPointListEdit list = curve.Points as IPointListEdit; 
      // If this is null, it means the reference at curve.Points does not 
      // support IPointListEdit, so we won't be able to modify it 
      if (list == null) 
       return; 

      double time = (Environment.TickCount - tickStart)/1000.0; 

      for (int i = 0; i < count; i++) 
      { 
       list.Add(time, (double)data[i]); 
      } 

      Scale xScale = PulseControl.GraphPane.XAxis.Scale; 

      if (time > xScale.Max - xScale.MajorStep) 
      { 
       xScale.Max = time + xScale.MajorStep; 
       xScale.Min = xScale.Max - 30.0; 
      } 

      // Make sure the Y axis is rescaled to accommodate actual data 
      PulseControl.AxisChange(); 
      // Force a redraw 
      PulseControl.Invalidate(); 

      count = 0; 
     } 

Hi. Я использую этот метод для рисования данных в реальном времени в zedgraph. count - длина входящих данных последовательного порта. Этот код отлично работает в таймере (20 мс) и рисует данные при каждом тике. Однако, если я переведу этот метод в класс, он работает неправильно. Он рисует слишком быстрые и неправильные данные.ZedGraph RealTime Data Plotting C#

public static void DrawingPulseData(byte[] data,ZedGraphControl zgc,int count, int TickStart) 

Я изменил параметры, как это, переместив его в класс. Я изменил PulseControl как zgc, отметьте как TickStart. Я не мог понять, почему он не работает так же, как первый код.

enter image description here

На первой картинке, используя код, предоставленный @discomurray, я написал этот код заявление из областей КРП в. Это дает мне такие данные.

Scale xScale = zgc.GraphPane.XAxis.Scale; 
    xScale.Max = now; 
    xScale.Min = now - 30.0; 

enter image description here

Если я пишу один и тот же код заявление в ИФ прицелы данных выглядит как изображение выше. Это 10 секундная запись. У меня нет таких данных с моим методом.

ответ

2

Я предполагаю, что tickCount является временем начала буфера данных.

При добавлении данных в список необходимо изменить значение x (время) для каждой точки в списке.

public static void DrawPulseData(byte[] data, ZedGraphControl zgc, int count, int tickStart) 
{ 
    double now = Environment.TickCount/1000.0; 

    if (count != 0) 
    { 
     double span = (now - tickStart); 

     double inverseRate = span/count; 

     for (int i = 0; i < count; i++) 
     { 
      list.add(tickStart + ((i+1) * inverseRate), data[i]); 
     } 
    } 

    Scale xScale = zgc.GraphPane.XAxis.Scale; 
    xScale.Max = now; 
    xScale.Min = now - 30.0; 

    PulseControl.AxisChange(); 
    PulseControl.Invalidate(); 
} 

как для рисования, так и быстро, как только вы скажете.

+0

Да, вы предполагали, что это время начала буфера данных. Я попробовал ваш код. Здесь что-то не так. Я скопировал Scale xScale = zgc.GraphPane.XAxis.Scale; и вклеил его из областей if. Однако он рисует что-то другое. Я загрузил некоторые фотографии, связанные с вашим кодом. – Blast

+0

Я установил местоположение инициализации xScale. как заполняются данные? это новые данные для каждого вызова или того же буфера с большим количеством точек в нем? является ли tickStart новым вызовом значения? вы используете потоки? – discomurray

+0

'int tickStart;' int Form_Load я использую 'tickStart = Environment.TickCount;' Затем я запускаю метод с тиком таймера (20 мс). Может быть, мы должны добавить ваш код в этот оператор if. 'if (time> xScale.Max - xScale.MajorStep) {xScale.Max = время + xScale.MajorStep; xScale.Min = xScale.Max - 30.0; } ' – Blast