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;
        }

やあ。このメソッドを使用して、zedgraph でリアルタイム データを描画しています。count着信シリアル ポート データの長さです。このコードは timer(20ms) で正常に動作し、各ティックでデータを描画します。ただし、このメソッドをクラスに移動すると、正しく機能しません。あまりにも速く間違ったデータを描画します。

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

クラスに移動した後、このようにパラメーターを変更しました。PulseControl を zgc に、tickstart を TickStart に変更しました。最初のコードと同じように動作しない理由がわかりませんでした。

ここに画像の説明を入力

最初の画像では、@discomurray から提供されたコードを使用して、このコード ステートメントを if のスコープ外に書きました。このようなデータが得られます。

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

ここに画像の説明を入力

同じコード ステートメントを if のスコープ データに書き込むと、上の図のようになります。10秒の記録です。私の方法ではそのようなデータはありません。

4

1 に答える 1

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();
}

高速に描画する場合は、指定した速度でしか進みません。

于 2013-09-11T23:06:30.540 に答える