从串行过滤双重消息

本文关键字:消息 过滤 | 更新日期: 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;
            }
        }
    }