Как работает serialEvent?

Я встречал несколько примеров использования функции SerialEvent(), которые выглядят следующим образом:

void serialEvent(){
  if(Serial.available()){
    \\do something 
  }
}

Функция SerialEvent() вызывается, когда данные доступны, поэтому в этом и заключается необходимость структуры if (или while), поскольку это всегда будет правда?

(В некоторых случаях я исключил структуру if, и код работает нормально)

, 👍3


2 ответа


Лучший ответ:

7

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

Функция SerialEvent() выполняется при каждом выполнении функции Loop(), если имеются доступные данные, поэтому это будет выглядеть примерно так:

while (true) 
{
    loop();
    if(data_available)
        serialEvent();
}

Если у вас в буфере есть только один байт информации, то у вас вообще не возникнет никаких проблем.

Но если вы хотите прочитать несколько байтов одновременно, вам придется подождать, пока loop() не выполнится снова, чтобы прочитать следующий байт.

Вы решите эту проблему, если напишете свой SerialEvent() следующим образом:

void serialEvent()
{
    while (Serial.available())
    {
        // сделай что-нибудь
    }
}

Таким образом, вы сразу прочтете всю доступную информацию, а затем вернетесь к циклу.

,

1

Ужасно, насколько неполны и скрыты многие вещи в IDE Arduino.

Мне потребовалось пять часов, чтобы понять, как функция serialEvent() работает для других портов (как serialEvent2() для последовательного порта №2).

>

То же самое и с тем, как работает сама функция. Я до сих пор не знаю... В качестве примера просто вставьте задержку в приведенный выше ответ, и это докажет, что: «Таким образом, вы прочитаете всю доступную информацию сразу, а затем вернетесь в цикл». НЕ верно.

void serialEvent()
  {
    while (Serial.available())
      {
        // сделай что-нибудь
      }
    delay(1000);
  }
,

не используйте SerialEvent, он не имеет преимущества перед if (Serial.available()) в цикле(), @Juraj