Проверьте, слушает ли последовательный порт

StackOverflow https://stackoverflow.com/questions/195304

  •  10-07-2019
  •  | 
  •  

Вопрос

У меня есть Arduino, отправляющая и получающая инструкции со скриптом Python через последовательный порт.

Arduino принимает состояние кнопки, и когда он нажимается, он отправляет сообщение через последовательный порт скрипту Python и ожидает ответа. (через Serial.available () ). Это работает достаточно хорошо.

Однако, если скрипт Python по какой-либо причине потерпел крах (в идеале он будет работать в фоновом режиме, поэтому его нелегко проверить), Arduino будет ждать вечно и будет недоступен даже при перезапуске скрипта.

Есть ли способ для моего Arduino проверить, прослушивает ли что-либо последовательный порт? (и предупредить меня мигающими огнями и т. д., если нет) или это не так, как работает серийный? В худшем случае, я думаю, я мог бы использовать тайм-аут, хотя это не идеально.

Это было полезно?

Решение

У вас ограниченные возможности определять, что-то слушает на другой стороне, используя выводы DSR / DTR.

Когда вы открываете последовательный порт на компьютере, на котором выполняются ваши сценарии, он должен поднять свой вывод DTR (или вы должны быть в состоянии убедить его сделать это: документация библиотеки, которую вы используете для управления COM-портом, должна указывать ты как).

Затем на вашем Arduino вы можете регулярно проверять его вывод DSR (предполагая, что нуль-модемное соединение соединяется с помощью рукопожатия, когда вывод DTR ПК подключен к DSR + CD на Arduino), и обрабатывать «никто не подключен». сценарий любым способом, который вы считаете нужным.

Одной из проблем этого подхода является то, что ваш сценарий ПК может не закрыть последовательный порт, когда он выходит из строя / перестает отвечать, оставляя вывод DTR включенным, как будто все по-прежнему в порядке. Кроме того, ваш скрипт может просто пропустить сообщение от Arduino из-за ошибок в последовательной линии.

По этой причине вы должны всегда устанавливать таймаут в своих процедурах получения: даже если на другом конце есть сторона, слушающая, нет гарантии, что она получила ваше сообщение (или что ответ дойдет до вас нетронутым).

Повторная отправка сообщения, по крайней мере, один раз (при условии, что DSR повышен), если происходит тайм-аут, делает ваш протокол более надежным.

Другие советы

Arduino не использует линию DSR или любую другую линию подтверждения связи, поэтому вы не можете делать то, что предлагаете.

Я согласен с mdb в том, что тайм-ауты необходимы, но также добавлю, что вы можете захотеть внедрить простую систему «вызов / ответ», которая периодически проверяет, слушает ли кто-либо. (Мне нравится аналогия пинг-понга от ircd).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top