Реализация команд управления для MCU через последовательный порт

8

Я ищу, чтобы интегрировать командный интерфейс в проект, который я делаю, который будет принимать последовательные команды с ПК.

Идея состоит в том, что устройство выполнит свою задачу, но ему отправят команду, оно выполнит ее. Это отличается от большинства примеров, которые мне удалось найти, это просто бездействующее устройство, ожидающее последовательных данных.

Например, устройство, которое управляет светодиодами и воспроизводит анимацию. Допустим, есть 3 предустановленных анимации, и когда он включается, он всегда воспроизводит номер 1. На стороне ПК я бы отправил команду «Play Preset 2», или «поменять цвет на зеленый», или отправил живую анимацию в реальном времени на устройство. играть на светодиодах.

Так что мой вопрос в том, что я не могу найти много информации об этом «шаблоне дизайна»? Я не знаю, с чего начать искать. Самое близкое, что я пришел, - это предварительно созданные библиотеки последовательного разбора arduino. Однако я ищу больше C / не Arduino / теоретический подход.

Я изучал последовательные протоколы, но это всего лишь вещи, такие как SPI, I2C и т. Д., А не то, как реализовать интерфейс управления / команд в программном обеспечении.

Я также узнал о HDLC, опять же, хотя это, кажется, больше стандарт / протокол. Похожая тема - /programming/1445387/how-do-you-design-a-serial-command-protocol-for-an-embedded-system, которая имеет очень полезную информацию, но опять же ее нужно сделать с протоколом / самой связью.

Я пытаюсь найти, как кодировать / реализовать это, чтобы создать команду или способность управления.

Должен ли я использовать бесконечный цикл для отслеживания и перехвата серийного номера для входящей команды, а также использовать список операторов IF для выбора, какую команду выполнять, но затем, что происходит, когда нет команд и система должна быть как обычно, или если она пропускает команду?

Управляемый прерыванием конечный автомат?

Есть ли официальное название для этого, которое можно использовать для исследования и поиска примеров?

РЕДАКТИРОВАТЬ:

Для тех, у кого такой же вопрос, я нашел этот действительно хороший пример во время исследования: http://www.adnbr.co.uk/articles/parsing-simple-usart-commands

binarysmacker
источник
Почему бы не использовать такие фреймворки, как FreeMODBUS или Firmata?
Игнасио Васкес-Абрамс

Ответы:

5

Существует много способов реализации протокола связи. Например, вы можете использовать:

  • человекочитаемый формат или двоичный
  • проверка ошибок, такая как контрольная сумма или CRC
  • символы начала и / или конца сообщения
  • длина сообщения, номер и т.д.
  • механизмы подтверждения / отрицательного подтверждения / повторной попытки

Ваша примерная команда понятна человеку и должна использовать '\ n' (ввод) в качестве конца символа сообщения. Начало / конец символов сообщения облегчает анализ входного потока.

Типичным потоком программы будет ожидание получения начального символа, а затем сохранение последующих байтов в буфере сообщений до получения конечного символа. Как только это произойдет, передайте буфер другой функции для анализа сообщения. Если нет начального символа, просто начните хранить байты немедленно, пока не будет получен конечный символ.

Большинство * встроенных систем работают в бесконечном цикле. Обработка последовательной передачи и приема осуществляется через прерывания на Arduino (см. HardwareSerial.cpp). Полученные символы помещаются в буфер. На каждой итерации цикла вы проверяете, есть ли в буфере какие-либо символы (Serial.available ()), и обрабатываете их. При получении символов с использованием прерываний ни один символ не должен быть пропущен. Вы не выполняете всю обработку в этих подпрограммах обработки прерываний, иначе они становятся слишком длинными и поэтому пропускают последующие прерывания.

Если вы не хотите, чтобы ваше устройство бездействовало, переведите его в состояние сна, чтобы «приостановить» цикл до прерывания или другого события.

Мне очень нравится эта библиотека для удобочитаемых сообщений: http://playground.arduino.cc/Code/Messenger

* Я не могу думать о системе, которая этого не делает, но, возможно, есть такая.

geometrikal
источник
3

Все, что ваша программа должна сделать:
1. часто проверять последовательный порт на наличие нового символа
2. переходить к соответствующей процедуре / устанавливать статус / что угодно, в зависимости от символа
3. перейти к 1

Программа может работать с одиночными символами, или вы можете создать свой собственный формат сообщения - я часто начинал каманд с «$» и заканчивал символом новой строки и использовал для команды читаемые символы ASCII (облегчает отладку!).

Убедитесь, что программа не зависнет, если она получит неверную команду!

Питер Беннетт
источник
Для этого некоторые автоматизированные испытательные устройства (ATE) используют очень похожие последовательные каналы.
ложка