Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 平均串行数据流值_C#_Stream_Serial Port_Buffer_Average - Fatal编程技术网

C# 平均串行数据流值

C# 平均串行数据流值,c#,stream,serial-port,buffer,average,C#,Stream,Serial Port,Buffer,Average,我有一个大约500赫兹的数据流来自串行端口。数据由控制机器的微处理器发送。数据被一个类过滤出来并显示在不同的文本框中,该类去掉传输协议使用的标题字符。 这是将我得到的四个变量分配给不同文本框的代码 private void SetText(string text) { if (this.txtOutput.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetTex

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

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个样本? 示例代码将非常感谢

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

}

谢谢你的建议。100只是一个数字,我认为平均100个样本可以提供更准确的测量,并有足够的时间来阻止文本框闪烁,但很明显,它甚至可以是1000。对x值的独立块求平均值很好,我不需要更复杂的计算。我担心的是,如果我让3个类计算这些值的平均值,应用程序就会冻结。可能是我错了吗?不,如果你只调用这个
Add()
方法,你将只更新1/100次,没有冻结。谢谢你。现在我要进行测试。您可以找到引发事件的代码,但也可以稍加修改,并将对窗口(或标签)的引用传递给Accum类。此类应减轻负载(
/100
)。线程不会有帮助。但是我看到了这一行:
txtOutput.AppendText(text+“\r\n”),摆脱它。