Подивіться на main.cpp (для коду avr у моїй установці) у файлі:
C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino\main.cpp
показує, що Arduino запускає loop() поперемінно з serialEventRun() у нескінченному циклі:
int main(void)
{
init();
initVariant();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
Перевірка HardwareSerial.cpp показує, що serialEventRun() просто викликає serialEvent (), якщо ви визначили його у вашому ескізі.
Це означає, що ви можете написати безпечний безкінечний цикл у циклі (), якщо ви не написали код serialEvent() і очікуєте, що він буде виконуватися регулярно.
Це викликає запитання: якщо serialEvent() викликається послідовно з loop (), буде викликано serialEvent (), якщо loop() не повертається? Іншими словами, чи припиняється serialEvent (), а також викликається, коли loop() повертається? Швидкий тест - див. Нижче - показує, що він не керований перериваннями, тому попередній абзац є істинним.
/*
Serial Event Checker
A sketch to see if serialEvent() is interrupt-driven.
Will serialEvent() be called if loop() never returns?
This code is based on Tom Igoe's SerialEvent example.
On (at least) Arduino Uno we find that serialEvent() simply runs
sequentially with loop(). When loop() never returns serialEvent()
is never called.
NOTE: The serialEvent() feature is not available on the Leonardo, Micro, or
other ATmega32U4 based boards.
R Symonds-Tayler 2018-02-01
This example code is in the public domain.
*/
String inputString = ""; //a String to hold incoming data
void setup() {
//initialize serial:
Serial.begin(115200);
//reserve 200 bytes for the inputString:
inputString.reserve(200);
}
// comment out this definition to allow loop() to return
#define INFINITE_LOOP
void loop() {
#ifdef INFINITE_LOOP
while(1);
#endif
}
/*
SerialEvent occurs whenever a new data comes in the hardware serial RX. This
routine is run between each time loop() runs, so using delay inside loop can
delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
while (Serial.available()) {
//get the new byte:
char inChar = (char)Serial.read();
//add it to the inputString:
inputString += inChar;
//if the incoming character is a newline, set a flag so the main loop can
//do something about it:
if (inChar == '\n') {
Serial.print("Got: '");
Serial.print(inputString);
Serial.println("'");
//clear the string:
inputString = "";
}
}
}
Це означає, що код serialEvent() може також перейти до основного циклу() у межах:
if(serial.available()){
//your code here...
}
блок.