Организация передачи данных по COM-порту

SpaceQuester
SpaceQuester аватар
Offline
Зарегистрирован: 27.01.2016
Всем привет!
 
Подскажите с огранизацией протокола передачи данных по COM-порту.
Есть Arduino Nano (со своим скетчем) и PC (например реализация в MATLAB, это не суть важно).
Arduino считывает данные с трёх аналоговых пинов (по типу analogRead(A0)) и непрерывно передаёт в Serial COM-порт.
Это:
1) управляющее напряжение источника питания фотоумножителя (положительные 0-5 Вольт)
2) реальное напряжение источника питания (оно через инвертор ОУ от 0 до минус 800 Вольт конвертируется в положительные 0-5 Вольт)
3) питания с выхода фотоумножителя (оно через инвертор ОУ от 0 до минус 40 Вольт конвертируется в положительные 0-5 Вольт)
Т.е. с Ардуино на PC в COM-порт отдаётся три потока с цифрами напряжений, их нужно как то разделять при приёме на PC.
С PC на Ардуино в COM-порт тоже может придти информация для выставления уровня ШИМ.
Т.е. эта информация должна разбираться только в скетче Ардуины.
 
На ум приходит такое решение. С Ардуины идут непрерывно пакеты в виде "SupplyControlVoltage:2,35", "SupplyOutputVoltage:3,86" и "PTMVoltage:1,67"
С компа может придти например: "FromPCSupplyControlVoltage:1,89".
 
Вопросы - как организовать такую передачу данных, как формировать сообщения в канал и на другой стороне разбирать их. Как их не перепутать?
Покажите пожалуйста пример.
Нужны ли открывающие и закрывающие биты для таких сообщений?
 
Спасибо!
kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Можно еще передавать это всё единым пакетом без префиксов типа "SupplyControlVoltage", т.е. позиционно, например, первый uint16_t это всегда SupplyControlVoltage, второй - SupplyOutputVoltage, а третий - PTMVoltage. Префикс начала посылки и контрольные суммы - по необходимости. Во всяком случае, я бы префикс (uint16_t) добавил. Аналогично в обратную сторону. Выделить одну свободную комбинацию (больше 1023), чтобы передавать значение, которое нужно игнорировать (например, не нужно менять какой либо параметр).

По возможности оперировать целыми значениями, чтобы не парить мозг floatом. Например, передавать значение * 100, а в компе делить на 100. Правда тогда в uint16_t не влезет.