我有一个变量“值”,它包含从串口接收到的最后一条消息。我有一个多行textBox "txtOutput“,它显示从串行接收到的所有消息。我还有一个if语句,它过滤特定的消息来执行我放置在txtOutput_TextChanged下的一些事情,以便在每次出现新消息时更新textBox6中的数字。
int turns = 0;
private void txtOutput_TextChanged(object sender, EventArgs e)
{
if (value == 1)
{
textBox6.text = turns.ToString();
turns ++;
}}当单击微开关时,我从连接到微处理器的串行端口接收消息"1“。微开关正在监视电机的旋转,它的转动非常缓慢。
在进一步实现RPM计数器之前,我的目标是使上面的计数系统正确无误。我现在遇到的问题是,通常微开关被按太长时间(50到100微秒),我从串行接收到几条连续的消息(2或3条),结果我计算的次数比真实的多。我已经在微控制器方面提供了一些延迟,但我不能发挥它太多,否则在不同的速度,我会遇到问题。是否有一种方法只考虑从串行接收到的一条消息,如果它们在1秒时间内连续地出现在同一类型?中。
我会感谢一些想法和样本片段。谢谢
发布于 2013-04-27 16:40:17
在微处理器中实现代码,只发送一次信号。与微开关的速度相比,微开关的关闭时间很长,因此它的关闭状态将在其打开之前被多次读取。此外,你还必须处理微开关触点的弹跳,即在微开关触点稳定之前,可能会有几个由于机械抖动而产生的短关闭/开启状态。
在我看来,以上是最好的解决方案,从源头上解决问题。
如果你想处理接收端的问题,你必须知道所有可能的频率--信号将被实时接收,否则你如何过滤接收到的信号?
编辑:您的速度如下: 12 rpm,信号之间的分钟时间:5秒,0.5rpm,信号之间的最大时间: 120秒。
所以当你收到一个信号时,你知道在下一个好信号出现之前至少需要5秒。
因此,这段代码可以过滤掉虚假信号:
// code to filter out false signals
DateTime lastTimeSignalReceived = DateTime.Now;
double minimumTimeBetweenSignals = 4.9; // 12 rpm = 5 seconds between signals minimum
int turns = 0;
private void txtOutput_TextChanged(object sender, EventArgs e)
{
if (value == 1)
{
// the if statement is true only if at least 4.9 seconds has past since last signal
// which should filter out false signals
if ((DateTime.Now - lastTimeSignalReceived).TotalSeconds > minimumTimeBetweenSignals)
{
// at least 4.9 seconds since last signal
textBox6.text = turns.ToString();
turns++;
// set lastTimeSignalReceived to new time
lastTimeSignalReceived = DateTime.Now;
}
}
}https://stackoverflow.com/questions/16253286
复制相似问题