А зачем, когда в среде Arduino IDE полно готовых функций для работы с Serial ? Разберемся на конкретном примере. Потребуется любая Arduino подобная платформа на контроллере ATMega328P (Nano, UNO) - вторая часть примера будет написана на C и для адаптации под другую платформу придется заглянуть в документацию на микроконтроллер который стоит в Вашей плате, чтобы узнать названия используемых регистров.
Напишем простенькую программу которая будет зажигать встроенный светодиод при отправке символа "A" и гасить его при отправке символа "B" через монитор порта встроенный в среду Arduino IDE и самое главное отправлять полученный символ обратно. С практической точки зрения отправка символа обратно нужна для того, чтобы знать точно, поступила ли команда? Пригодится такая реализация может в том случае если Arduino находится на расстоянии 1-2 км (на Ali без проблем можно найти радио-модули на такую дальность связи) и нам необходимо точно знать, дошла и выполнилась наша команда или нет.
Алгоритм работы программы написанный на Arduino Wiring будет следующий:
Сама программа будет выглядеть следующим образом.
Как будет работать данная программа если кроме светодиода потребуется в основном цикле loop () выполнять какие-нибудь трудоемкие операции (например вывод данных на какой-нибудь e-Paper дисплей занимающий 2-4 секунды) ?
Дисплей я цеплять не буду, сымитируем вывод на дисплей оператором delay (); который какое то время выполняет бесполезные операции.
Если в момент мигания светодиодом придет байт, то он никуда не пропадет, а будет сохранен во внутреннем буфере, но задержка обработки этой команды и отправка ответа составит до 2-х секунд в зависимости от того в какой момент времени мы этот байт отправим.
Профессиональные "мигальщики" светодиодом разумеются легко перепишут данный код используя оператор millis() или таймер, но если в самоделке будет работа с "железкой" требующая больших ресурсов или сложная математика - такой подход не прокатит. Поэтому грамотное мигание светодиодом оставим профессионалам, поработаем с Arduino как домохозяйка или ребенок без использования ардуиновских функций.
Для начала необходимо сконфигурировать порт
Переменную мы будем обновлять в прерывании, поэтому необходимо использовать ключевое слово volatile. Её в дальнейшем можно будет использовать и в основном цикле loop в качестве флага для включения чего-нибудь ресурсоемкого.
В бесконечном цикле loop осталась только изменение состояния светодиода на ПИН 5.
Как только Arduino получит байт:
- выполнение основного цикла будет приостановлено
- будет вызвана процедура прерывания ISR(USART_RX_vect) {}
- состояние встроенного светодиода будет изменено, а сам байт будет отправлен обратно.
- выполнение основного цикла будет продолжено
Теперь в основном цикле можно делать математические расчеты, выводить на дисплей картинку, обрабатывать данные с каких-либо датчиков - Arduino всегда будет моментально отвечать по первому запросу. Используя данный механизм можно и получать какую-нибудь телеметрию с устройства если вносить данные с датчика в переменную b непосредственно в основном цикле.
Если "на пальцах" механизм работы с UART достаточно простой. Приходящий сигнал от компа через встроенный в плату Arduino USB-UART преобразователь занимается, "ногодрыгом" ножки Rx. Аппаратное обеспечение микроконтроллера, анализирует этот "ногодрыг", и укладывает полученные биты в 8-ми битный регистр UDR. После того как пришла вся посылка - вызывается прерывание, говорящее о том, что данные можно забирать. Для отправки данных мы пишем в регистр UDR байт, аппаратное обеспечение микроконтроллера дрыгает ножкой Tx пока не отправит байт целиком. Приводить графики сигналов, схему аппаратной части, форматы посылок в статье, нет ни какого смысла - лучше ознакомиться с этим в специализированной литературе.
Как видно из примера - решать практические задачи на голом С гораздо проще, чем с использованием встроенного в среду Arduino IDE языка Arduino Wiring, а учитывая то, что вместо компьютера можно подключить другую плату и любой китайский радио-модуль, легко организовать умную, полностью автономную радиосвязь с радиусом действия в несколько километров.
Но это уже совсем другая история, которую все равно не кому не покажут так как, это не скопированное чужое видео с Тик-Ток )))
Полный список статей доступен по этой ссылке:
Список всех статей канала ESP32 и Arduino
Всем удачи!