Извините, если это очень расплывчатый вопрос, но я не могу правильно его сформулировать, чтобы найти кого-то еще с этой проблемой. Главный вопрос заключается в том, что если между двумя устройствами установлено последовательное соединение, как вы используете это соединение для реализации двусторонней связи?
Пример может помочь. Предположим, у вас есть датчик температуры в виде встроенного устройства, использующего микроконтроллер и прошивку, написанную на C. У вас есть подключение этого датчика к компьютеру через последовательный порт и некоторое программное обеспечение на компьютере для взаимодействия с ним, например, приложение C++. Я понимаю, как настроить последовательные порты с обеих сторон и читать и записывать отдельные байты данных между двумя устройствами. Настоящий вопрос заключается в том, какое соглашение вы используете для связи между двумя устройствами?
Предположим, что ваши требования таковы:
1.) Вы должны иметь возможность отправить команду, чтобы получить одно значение температуры со встроенного устройства и отправить его на компьютер для отображения.
2.) Вам необходимо отправить команды, чтобы датчик начал и прекратил потоковую передачу значений температуры.
3.) Вам нужен набор команд для настройки различных аспектов прошивки, таких как скорость потоковой передачи, поток при запуске, мигание светодиодов и т. д.
4.) Вам нужна какая-то структура для отправки сложных форм данных на компьютер, возможно, массив показаний напряжения батареи.
Способы добиться этого
Кажется, есть несколько способов, которыми люди склонны делать это:
Простой строковый API:
Наиболее распространенный, связанный со сторонними датчиками, кажется, использует простой API на основе строк, так что команды для запуска и остановки потоков могут быть «SS, 1 \ r» и «SS, 0 \ r» соответственно. В этом случае вам придется читать из последовательного порта, пока вы не получите символ «\ r», а затем проанализировать полученные данные, чтобы увидеть, есть ли у них команда (слева от запятой) и параметры (справа от запятой). Это работает для сценариев с 1 по 3 выше, но не делает сценарий 4 очень простым.
API строк JSON:
Это работает так же, как и выше, но вместо того, чтобы передавать ваши параметры в виде простых значений, вы передаете объекты JSON, которые могут представлять сложные структуры данных. Следовательно, вы можете отправить массив напряжений батареи в виде массива JSON. Этот метод, по-видимому, охватывает все варианты использования 1-4 выше. Но JSON отправляет строки, и его сложнее анализировать с помощью встроенного c. Это сотворило бы чудеса для компьютерной части, которая могла бы использовать язык более высокого уровня, такой как Java, в котором есть библиотеки для чтения данных JSON.
API стиля пакетов:
Это решение, которое мы приняли, о котором я сейчас немного сожалею. Это включает в себя отправку структурированного пакета байтов для каждой части данных, которые мы отправляем. Структура пакета показана ниже.
[0xFF][0xFF][ID][CMD][D0][D1][D2][D3][D4][D5][D6][D7][0xEE][0xEE][0xEE]
С помощью этой структуры мы отправляем заголовок и нижний колонтитул (0xFF и 0xEE) для проверки полноты пакета, идентификатор для отправки последовательных пакетов (для передачи массива данных), массив данных, который мы можем использовать для упаковки длинных, плавающих, целых и т. д. , и командный байт (CMD), который может использоваться устройством для определения того, как анализировать полезную нагрузку данных (D0-D7).
Поэтому я спрашиваю, какой наиболее предпочтительный способ связи через последовательный порт? Есть ли другие способы, которыми я упускаю? В последнее время я много занимался веб-разработкой, и мне кажется, что JSON — это хорошая абстрактная система передачи, но у нее есть свои ограничения, потому что вам нужно выполнять гораздо больше синтаксического анализа строк, что немного сложно на стороне прошивки.