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