Как работает serialEvent?
Я встречал несколько примеров использования функции SerialEvent(), которые выглядят следующим образом:
void serialEvent(){
if(Serial.available()){
\\do something
}
}
Функция SerialEvent() вызывается, когда данные доступны, поэтому в этом и заключается необходимость структуры if
(или while
), поскольку это всегда будет правда
?
(В некоторых случаях я исключил структуру if
, и код работает нормально)
@user3060854, 👍3
2 ответа
Лучший ответ:
Насколько я понимаю, использование оператора if не будет иметь никакого значения, а использование оператора while будет иметь значение.
Функция SerialEvent() выполняется при каждом выполнении функции Loop(), если имеются доступные данные, поэтому это будет выглядеть примерно так:
while (true)
{
loop();
if(data_available)
serialEvent();
}
Если у вас в буфере есть только один байт информации, то у вас вообще не возникнет никаких проблем.
Но если вы хотите прочитать несколько байтов одновременно, вам придется подождать, пока loop()
не выполнится снова, чтобы прочитать следующий байт.
Вы решите эту проблему, если напишете свой SerialEvent()
следующим образом:
void serialEvent()
{
while (Serial.available())
{
// сделай что-нибудь
}
}
Таким образом, вы сразу прочтете всю доступную информацию, а затем вернетесь к циклу.
Ужасно, насколько неполны и скрыты многие вещи в IDE Arduino.
Мне потребовалось пять часов, чтобы понять, как функция serialEvent()
работает для других портов (как serialEvent2()
для последовательного порта №2).
То же самое и с тем, как работает сама функция. Я до сих пор не знаю... В качестве примера просто вставьте задержку в приведенный выше ответ, и это докажет, что: «Таким образом, вы прочитаете всю доступную информацию сразу, а затем вернетесь в цикл». НЕ верно.
void serialEvent()
{
while (Serial.available())
{
// сделай что-нибудь
}
delay(1000);
}
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- В чем разница между Serial.write и Serial.print? И когда они используются?
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Программы построения последовательных данных
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Очистить существующий массив при получении новой последовательной команды
не используйте SerialEvent, он не имеет преимущества перед
if (Serial.available())
в цикле(), @Juraj