0

我有一个变量“值”,其中包含从串行端口收到的最后一条消息。我有一个多行文本框“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 秒时间跨度?

我将不胜感激一些想法和示例片段。谢谢

4

1 回答 1

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;
            }
        }
    }
于 2013-04-27T16:40:17.397 回答