Есть ли версия Arduino, которая может делать что-то вроде последовательного прерывания?

Я использую Arduino для управления сервоприводом MX18A через последовательный порт и пытаюсь использовать компьютер для связи с Arduino через другой последовательный порт для отправки команд на Arduino и изменения режима управления сервоприводом. Я надеюсь, что после того, как компьютер отправит сообщение на Aruduino, он сможет вовремя отреагировать, потому что может произойти что-то чрезвычайное, например, сервопривод выйдет из-под контроля, и в этом случае мне придется вовремя изменить стратегию управления.

Однако, похоже, что у Arduino, таких как UNO и MEGA, нет последовательного прерывания, поэтому, как только приходит сообщение от компьютера, он не может вовремя отреагировать.

Я знаю, что оценка serial.available() в каждом цикле — это одно из решений, но в моей другой стратегии управления сервоприводом есть много временных задержек, циклов for и циклов while, что означает, что мне приходится помещать serial.available() в каждую временную задержку или циклы for, что затрудняет написание и поддержку кода.

, 👍0

Обсуждение

«_имеется много задержек_». Это ваша проблема. Решение — научиться программировать [без задержек](https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay)., @Edgar Bonet

@EdgarBonet А как насчет циклов for и while? Они распространены в дизайне кода, и оба они займут некоторое время и дадут тот же эффект, что и явная delay., @scottxiao

Тогда вам понадобится [конечный автомат](https://hackingmajenkoblog.wordpress.com/2016/02/01/the-finite-state-machine/). В двух словах: если вам нужно быть отзывчивым, программируйте в неблокирующей манере., @Edgar Bonet

Хотя все платы поддерживают последовательные прерывания на своем последовательном порту, имейте в виду, что платы на базе `328, такие как Uno, имеют только один последовательный порт. Реализации "Software Serial" могут быть *частично* основаны на прерываниях, но, как правило, требуют много внимания процессора во время приема, поэтому могут не вписаться в дизайн программы, зависящей от прерываний., @Chris Stratton

@ChrisStratton Я использую UNO на своей платформе, которая имеет четыре последовательных порта., @scottxiao

@bigxiao это вообще не имеет смысла. У Uno только один последовательный порт. Если у вас есть приложение, которому нужно четыре, это неподходящий выбор для вас, так как даже один программный последовательный экземпляр добавляет много сложностей. Если вам нужно четыре последовательных порта, а Arduino может вообще не быть решением для вас, возможно, вам следует пересмотреть общую архитектуру., @Chris Stratton

У Mega есть 4 аппаратных последовательных порта., @Edgar Bonet


2 ответа


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

2

Это не тот случай, когда «Arduino» может выполнять последовательные прерывания. Все платы Arduino имеют последовательные прерывания, но они уже используются для получения данных и сохранения их в буфере, чтобы вы могли использовать их, когда у вас будет время.

Ардуино API не определяет никаких последовательных процедур обработки прерываний. Такого рода вещи предназначены для внутренней обработки кодом API, а не пользователем. В этом весь смысл Ардуино API — абстрагировать такие технические детали от пользователя.

Если вы хотите использовать последовательное прерывание самостоятельно, вам придется написать собственный код обработки последовательного прерывания.

Или напишите свой код таким образом, чтобы последовательные прерывания не требовались.

,

Как написать определяемый пользователем код последовательной обработки и заменить исходный код по умолчанию? Есть ли какой-либо интерфейс для пользователя, чтобы сделать это?, @scottxiao

@bigxiao: Найдите файл с именем «HardwareSerial.cpp» в установке Arduino, скопируйте его в каталог вашего скетча и настройте его в соответствии со своими потребностями., @Edgar Bonet


-1

Почему бы не использовать таймер для проверки наличия данных в последовательном буфере каждые, скажем, 2 секунды? В DUE прерывания доступны на ВСЕХ контактах, поэтому это может быть жизнеспособным альтернативным решением. В любом случае не следует использовать блокирующий код, например while и delays.

,

Arduino DUE имеет последовательное прерывание, которое открыто для пользователей?, @scottxiao

В нем говорится, что ВСЕ цифровые контакты на DUE работают с прерываниями, поэтому если вы установите прерывание на последовательной линии RX, оно сработает при получении данных., @Brian Moreau