平均串行数据流值
本文关键字:数据流 | 更新日期: 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;
}
}