#serial-port #arduino
Вопрос:
У меня есть Arduino, отправляющий и получающий инструкции с помощью скрипта Python через последовательный порт.
Arduino принимает состояние кнопки, и когда она нажата, он отправит сообщение через последовательный порт скрипту Python и будет ждать ответа. (через Serial.available()
). Это работает достаточно хорошо.
Однако, если сценарий Python по какой-либо причине потерпел крах (в идеале он будет работать в фоновом режиме, поэтому его нелегко проверить), Arduino будет ждать вечно и будет недоступен даже при перезапуске сценария.
Есть ли способ для моего Arduino проверить, прослушивает ли что-то последовательный порт? (и предупредите меня мигающими огнями и т. Д., Если нет) Или это не так, как работает сериал? В худшем случае, я думаю, я мог бы использовать тайм-аут, хотя это не идеально.
Ответ №1:
У вас есть ограниченная возможность определить, прослушивает ли что-то с другой стороны, используя контакты DSR/DTR.
Когда вы открываете последовательный порт на компьютере, на котором выполняются ваши сценарии, он должен поднять свой DTR-вывод (или вы должны быть в состоянии убедить его сделать это: документация библиотеки, которую вы используете для управления COM-портом, должна рассказать вам, как это сделать).
Затем на вашем Arduino вы можете регулярно проверять его вывод DSR (при условии подключения нуль-модема с помощью рукопожатия, где вывод DTR ПК подключен к DSR CD на Arduino) и обрабатывать сценарий «никто не подключен» любым способом, который вы считаете нужным.
Одна из проблем такого подхода заключается в том, что ваш компьютерный скрипт может не закрыть последовательный порт, когда он выходит из строя/перестает отвечать, оставляя пин-код DTR включенным, как будто все по-прежнему в порядке. Кроме того, ваш скрипт может просто пропустить сообщение от Arduino из-за ошибок в последовательной линии.
По этой причине вы всегда должны использовать тайм-аут в своих процедурах приема: даже если на другом конце есть сторона, слушающая вас, нет никакой гарантии, что она получила ваше сообщение (или что ее ответ дойдет до вас в целости и сохранности).
Повторная отправка сообщения по крайней мере один раз (при условии, что DSR повышен) при возникновении тайм-аута делает ваш протокол более надежным.
Комментарии:
1. твое здоровье, приятель. Интересным моментом является то, что Google получил ваш ответ через 3 минуты после того, как вы его опубликовали.
2. Джефф Этвуд написал в твиттере, что Google составляет почти 50% трафика на этот сайт. (Черт возьми, не могу найти твит, мой Google foo сегодня не работает)
3. Эй, спасибо за начальную подсказку, но, к сожалению, я не могу найти больше информации об этом, чтобы продвинуться дальше. Можете ли вы предоставить пример кода, как получить доступ к контакту DSR для Arduino? Ваше здоровье!
Ответ №2:
Arduino не использует линию DSR или любую другую линию рукопожатия, поэтому вы не можете сделать то, что предлагаете.
Ответ №3:
Я согласен с mdb в том, что тайм-ауты необходимы, но также хотел бы добавить, что вы, возможно, захотите внедрить простую систему вызова/ответа, которая периодически проверяет, слушает ли кто-нибудь. (Мне нравится аналогия ircd с пинг-понгом).