Вы должны помнить и думать об Arduino как о единственном резьбовом устройстве. Пока он делает ничего он не может ничего сделать. Период! Однако в отношении последовательного порта буфер по-прежнему будет принимать входящие данные на RX, однако, если ситуация с переполнением возникает во время блокировки, управление невозможно.
Смотрите следующий взят непосредственно из Arduino ссылку
Некоторых вещей действительно идут на в то время как функция задержки() управляет чипом ATmega Однако, поскольку функция задержки не отключает прерывания. Запись последовательной связи, которая появляется на выводе RX, записывается, значения PWM (analogWrite) и состояния выводов поддерживаются, а прерывания будут работать так, как должны. Reference
Теперь, говоря, что, когда вы настраиваете задержку до 5 секунд между петлями (delay(5000)
) вы, по сути блокирует его делать что-нибудь еще почти полную остановку.
Рамка Arduino предоставляет счетчик (millis()
), который в основном работает с момента загрузки в течение примерно 50 дней с шагом в 1 миллисекунду. См Arduino - millis()
В приложении вы должны определить (вспомнить), что петля вы должны были бежать &, когда указанный цикл кончил так, чтобы не позволить другому циклу работать, пока millis()
счетчик не определенное количества больше, чем ваш кол , (Не забудьте определить количество как long
)
Тогда что вы делаете, это переместить петлю в отдельные функции, которые будут выполнять только если if
оператор возвращает истину ...
, например ...
long interval = 5000; // Define interval outside of the main loop
long previousCount = 0; // Used to store milli count when finished
int loopPosition = 1;
void loop()
{
if ((long)millis() - previousCount >= 5000)
// This if statement will only return true every 5 seconds (5000ms)
{
if (loopPosition == 1)
{
function_One();
previousCount = millis(); // Redefine previousCount to now
loopPosition++; // Increment loop position
}
else if (loopPosition == 2)
{
function_Two();
previousCount = millis();
loopPosition--; // Decrement loop position
}
}
// Do Anything Here You Want
// - While ever the if statement above returns false
// the loop will move to this without hesitation so
// you can do things like monitor a pin low/high scenario.
}
void function_One()
{
// Do Your First Loop
}
void function_Two()
{
// Do Your Second Loop
}
Вышеуказанная информация остановит любую задержку, которую вы используете, от блокировки, и до некоторой степени, почти задержите устаревшую, если она будет реализована правильно при правильных сценариях.
Что касается вашего последовательного комментария данных, как я сказал в верхней части этой статьи, Arduino может только делать одну вещь за раз. Передача и прием при точно то же время невозможно даже с Mega.Говоря, что доска, подобная «Uno», например, способна только на один последовательный интерфейс, где «Mega» способен на четыре.
Удачи ....
NB- Для начинающего, читающего это, следующий учебник/пример охватывает то, что у меня выше, на простых условиях и является отличным строительным блоком для дальнейшей удивительности! Arduino - Blink Without Delay
Большое спасибо, это объясняет многое очень четко. Мой вопрос о последующей деятельности - это то, что является целью Mega, имеющей четыре аппаратных последовательных порта? – wellington
Не используя все четыре себя, я не говорю по опыту, однако наилучшим будет использование четырех отдельных последовательных интерфейсов ... Я добавил объяснение относительно последовательного буфера, который вы можете использовать. Просто будьте осторожны, поскольку он содержит только 64 байта – RussDunn