从串行过滤双重消息
本文关键字:消息 过滤 | 更新日期: 2023-09-27 18:11:04
我有一个变量"value",其中包含从串行端口接收的最后一条消息。我有一个多行文本框"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秒的时间范围内连续出现相同类型的消息?
我将感激一些想法和样本片段。由于
在微处理器中实现只发送一次信号的代码。微动开关相对于微动速度闭合的时间较长,因此在微动开关打开之前,其闭合状态会被读取不止一次。此外,您还必须处理微动开关触点的弹跳,即在稳定之前,由于机械抖动可能会有几个短的闭合/打开状态。
我认为以上是最好的解决办法,从源头上解决问题。
如果你希望在接收端处理这个问题,你必须知道信号将被接收的所有可能的频率,实时的,否则你如何过滤接收到的信号?
编辑:所以你的速度如下:12转,信号间隔时间:5秒0.5 rpm,最大信号间隔时间: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;
}
}
}