2013-04-27 2 views
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 секунда?

Я был бы признателен за некоторые идеи и образцы отрывков. Спасибо

ответ

1

Внесите код в микропроцессор, чтобы отправить сигнал только один раз. Микровыключатель закрывается на время по сравнению со скоростью микроконтроллера, поэтому его закрытое состояние будет читаться несколько раз до его открытия. Кроме того, вам приходится иметь дело с отказом контактов микропереключателя, то есть может быть несколько коротких замыкающих/открывающих состояний из-за механического джиттера до его стабилизации.

На мой взгляд, это лучшее решение, справиться с проблемой у источника.

Если вы хотите решить проблему на принимающей стороне, вам необходимо знать все возможные частоты, которые будут приниматься в режиме реального времени, иначе как вы можете отфильтровать принятый сигнал?

Edit: Так ваша скорость следующим образом: 12 оборотов в минуту, мин Время между сигналами: 5 секунд 0,5 оборотов в минуту, максимальное время между сигналами: 120 секунд

Итак, когда вы получаете сигнал, вы знаете, займет не менее 5 секунд до появления следующего сигнала GOOD.

Так что этот код может отфильтровать ложные сигналы:

// 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; 
      } 
     } 
    } 
+0

Ну ..... я бы не ставил вопрос о данном разделе, если я думаю, что есть больше возможностей на языке микропроцессора для решения проблема. Я думаю, что у C# гораздо больше возможностей и ресурсов для управления определенной функцией, чтобы избежать описанной проблемы. – FeliceM

+0

Максимальная скорость двигателя составляет 12 оборотов в минуту, а минимальная - 0,5 в минуту. Я планирую запустить таймер на 1 секунду, когда появится новое сообщение и сохранит его в массиве. Затем через одну секунду возьмите последнее сообщение массива и рассмотрите его для плюс 1 оборот, сбросьте массив и дождитесь следующего. Таким образом, я должен иметь возможность фильтровать последовательные сообщения, вызванные длительным отключением коммутатора. Лучшая идея? – FeliceM

+0

Спасибо, я попытаюсь реализовать что-то вокруг кода, который вы предложили.Выглядит неплохо и может помочь мне также решить другие проблемы, которые я испытываю с ложными сообщениями из-за шума во время переходных процессов. – FeliceM

Смежные вопросы