过滤来自串行的双重消息

时间:2013-04-27 14:33:08

标签: c# serialization filter

我有一个变量“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秒钟?

我会很感激一些想法和样本片段。 感谢

1 个答案:

答案 0 :(得分:1)

在微处理器中实现代码,仅发送一次信号。与微型速度相比,微型开关关闭的时间较长,因此在打开之前,其闭合状态将被多次读取。此外,您必须处理微动开关触点的反弹,即在稳定之前由于机械抖动可能会有几种短的闭合/打开状态。

在我看来,上面是最好的解决方案,从源头处理问题。

如果您希望在接收端处理问题,您必须实时知道接收信号的所有可能频率,否则您如何过滤接收到的信号?

编辑: 所以你的速度如下: 12 rpm,信号之间的最短时间:5秒 0.5 rpm,信号之间的最大时间:120秒

因此,当您收到信号时,您知道在下一个GOOD信号出现之前至少需要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;
            }
        }
    }