0

私は約でデータのストリームを持っています。シリアルポートからの 500 Hz。データは、マシンを制御しているマイクロプロセッサによって送信されます。データは、伝送プロトコルで使用されるヘッダー文字を取り除くクラスによってフィルター処理され、別のテキスト ボックスに表示されます。これは、取得した 4 つの変数をさまざまなテキスト ボックスに割り当てるコードです。

private void SetText(string text)
    {
        if (this.txtOutput.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText);
            this.BeginInvoke(d, new object[] { text });
        }
        else
        {
            txtOutput.AppendText(text + "\r\n");
            string a = "", b = "", c = "", d="";
            string invia = text.ToString();
            Stripper strp = new Stripper();
            strp.Distri(invia, out a, out b, out c, out d);
            if (a != "")
            {
                textBox7.Text = a; //currentRes
            }
            if (b != "")
            {
                textBox2.Text = b; //temperature
            }

            if (d != "" )
            {
             textBox3.Text = d; //motor current
            }

            if (c == "1\r") //motor RPM
            {
                timer3.Start();
            }
        }
    }

私が直面している問題は、毎秒何百もの値「a」、「b」、および「d」を取得し、明らかに関連するテキストボックスがちらつくことです。さらに、関連するテキスト ボックスに表示する前に、各タイプの 100 サンプルを取得して、各変数の値を平均したいと思います。これにより、ちらつきが回避され、より正確な読み取りが可能になります。

変数 "a"、"b"、"d" のそれぞれを、その間に他の機能を制御する必要があるアプリケーションをフリーズせずに x サンプルに平均化するにはどうすればよいですか? サンプル コードは非常に高く評価されます。

4

1 に答える 1

1

100サンプルを取得して各変数の値を平均します...より正確な読み取り値が得られます

では、この 100 という数字はどこから来ているのでしょうか? GUI のデザインから来ているのでしょうか、それとも何らかの形でデータに関係しているのでしょうか?

また、独立した (隣接する) ブロックを平均化したいですか、それとも移動平均が必要ですか?

簡単なアプローチ:

class Accum
{
    private int sum, count;

    public event AverageChanged; 

    public void Add(int value)
    {
       sum += value;
       count += 1;
       if (count >= 100)
       {
           OnAvarerageChanged(sum/count);
           sum = 0;
           count = 0;
       }
    }

    ....

}

フォームにこれの 3 つのインスタンスを作成する必要があります。すべての SerialPort データは同じスレッドで発生するため、イベントを処理するときにのみ同期する必要があります。

アップデート:

最も簡単だが一般的ではないアプローチ:

class Accum
{
    private int sum, count;

    //public event AverageChanged; 

    public void Add(int value)
    {
       sum += value;
       count += 1;
       if (count >= 100)
       {
           OnAvarerageChanged(sum/count);
           sum = 0;
           count = 0;
       }
    }

    public Label MyLabel { get; set; }

    private void OnAvarerageChanged(int av)
    {
        SetTextCallback d = new SetTextCallback(SetText);
        string text = av.ToString();
        MyLabel.BeginInvoke(d, new object[] { text });
    }

    private void SetText(string text)
    {
        this.MyLabel.Text = text;
    }

}
于 2013-06-16T08:09:00.210 に答える