Есть ли версия Arduino, которая может делать что-то вроде последовательного прерывания?
Я использую Arduino для управления сервоприводом MX18A через последовательный порт и пытаюсь использовать компьютер для связи с Arduino через другой последовательный порт для отправки команд на Arduino и изменения режима управления сервоприводом. Я надеюсь, что после того, как компьютер отправит сообщение на Aruduino, он сможет вовремя отреагировать, потому что может произойти что-то чрезвычайное, например, сервопривод выйдет из-под контроля, и в этом случае мне придется вовремя изменить стратегию управления.
Однако, похоже, что у Arduino, таких как UNO и MEGA, нет последовательного прерывания, поэтому, как только приходит сообщение от компьютера, он не может вовремя отреагировать.
Я знаю, что оценка serial.available()
в каждом цикле — это одно из решений, но в моей другой стратегии управления сервоприводом есть много временных задержек, циклов for
и циклов while
, что означает, что мне приходится помещать serial.available()
в каждую временную задержку или циклы for
, что затрудняет написание и поддержку кода.
@scottxiao, 👍0
Обсуждение2 ответа
Лучший ответ:
Это не тот случай, когда «Arduino» может выполнять последовательные прерывания. Все платы Arduino имеют последовательные прерывания, но они уже используются для получения данных и сохранения их в буфере, чтобы вы могли использовать их, когда у вас будет время.
Ардуино API не определяет никаких последовательных процедур обработки прерываний. Такого рода вещи предназначены для внутренней обработки кодом API, а не пользователем. В этом весь смысл Ардуино API — абстрагировать такие технические детали от пользователя.
Если вы хотите использовать последовательное прерывание самостоятельно, вам придется написать собственный код обработки последовательного прерывания.
Или напишите свой код таким образом, чтобы последовательные прерывания не требовались.
Как написать определяемый пользователем код последовательной обработки и заменить исходный код по умолчанию? Есть ли какой-либо интерфейс для пользователя, чтобы сделать это?, @scottxiao
@bigxiao: Найдите файл с именем «HardwareSerial.cpp» в установке Arduino, скопируйте его в каталог вашего скетча и настройте его в соответствии со своими потребностями., @Edgar Bonet
Почему бы не использовать таймер для проверки наличия данных в последовательном буфере каждые, скажем, 2 секунды? В DUE прерывания доступны на ВСЕХ контактах, поэтому это может быть жизнеспособным альтернативным решением. В любом случае не следует использовать блокирующий код, например while и delays.
Arduino DUE имеет последовательное прерывание, которое открыто для пользователей?, @scottxiao
В нем говорится, что ВСЕ цифровые контакты на DUE работают с прерываниями, поэтому если вы установите прерывание на последовательной линии RX, оно сработает при получении данных., @Brian Moreau
- Отправка последовательных данных в прерывании
- Серийное прерывание
- Есть ли способ использовать последовательный порт в качестве источника прерывания?
- Можно ли безопасно использовать последовательный порт в процедуре прерывания SPI?
- Является ли мой скетч «потокобезопасным»?
- atmega88 timer2 32.768KHz и проблема с последовательным интерфейсом
- Простое последовательное сообщение непоследовательно (иногда перемешано)
- Целесообразно ли использовать Serial.write в ISR, когда loop() обычно использует Serial.read?
«_имеется много задержек_». Это ваша проблема. Решение — научиться программировать [без задержек](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