平均串行数据流值

本文关键字:数据流 | 更新日期: 2023-09-27 18:18:40

我有一个数据流。500hz来自串口。数据由控制机器的微处理器发送。数据通过一个类过滤出来并显示在不同的文本框中,该类去掉传输协议使用的报头字符。这是将我得到的四个变量分配给不同文本框的代码。

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"answers"d"每秒,显然相关的文本框是闪烁。此外,我想在相关文本框中显示每种类型的100个样本之前,对每个变量的值取平均值。这将避免闪烁,并将给出更准确的读数。

我如何将每个变量"a","b"answers"d"平均到x个样本而不冻结应用程序,同时必须为其他特征提供控制?示例代码将非常感谢。

平均串行数据流值

取每个变量取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;
    }
}