C# 从串行数据中筛选双重消息

C# 从串行数据中筛选双重消息,c#,serialization,filter,C#,Serialization,Filter,我有一个变量“value”,它包含从串行端口接收的最后一条消息。 我有一个多行文本框“txtOutput”,它显示从串口接收到的所有消息。 我还有一个if语句,它过滤一条特定的消息,执行我放在txtOutput_TextChanged下的操作,以便在每次有新消息时更新textBox6中的数字 int turns = 0; private void txtOutput_TextChanged(object sender, EventArgs e) { if (val

我有一个变量“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转/分,信号之间的最大时间: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;
            }
        }
    }

嗯……如果我认为微处理器语言有更多的功能来解决这个问题,我就不会在这一部分提出这个问题。我认为C#有更多的能力和资源来管理特定功能以避免所述问题。电机的最大转速为每分钟12转,最小转速为每分钟0,5转。我正在考虑在有新消息时触发计时器1秒,并将其存储在数组中。然后,在一秒钟之后,取出数组的最后一条消息,并考虑它加1转,重置数组并等待下一个。通过这种方式,我应该能够过滤由于开关长时间关闭而导致的连续消息。还有更好的主意吗?谢谢,我将尝试围绕您建议的代码实现一些东西。看起来很不错,还可以帮助我解决由于瞬态过程中的噪音而导致的错误消息的其他问题。@FeliceM。不客气!从你的个人资料我推断你的微处理器是Arduino?我已经围绕Arduino Uno做了一个家庭自动化解决方案,它工作得很好。如果您按照上的文章进行操作,那么您可能会找到处理端口上的触点反弹和采样信号的代码。我相信我在那里看到了施密特触发器作为一个软件例程,它非常适合处理触点反弹。非常感谢。实际上是一个Arduino Uno。