Съжалявам, ако това е много неясен въпрос, но изглежда не мога да го формулирам правилно, за да намеря някой друг с този проблем. Основният въпрос е, след като имате установена серийна връзка между две устройства, как използвате тази връзка за осъществяване на двупосочна комуникация?
Един пример може да помогне. Да предположим, че имате температурен сензор като вградено устройство, използващо микроконтролер и фърмуер, написан на C. Имате връзка със сериен порт от този сензор към компютър и някакъв софтуер на компютъра за взаимодействие с него, да речем C++ приложение. Разбирам как да настроя серийните портове от двете страни и да чета и записвам единични байтове данни между двете устройства. Истинският въпрос е каква конвенция използвате за комуникация между двете устройства?
Да приемем, че вашите изисквания са както следва:
1.) Трябва да можете да изпратите команда за отчитане на единична температура от вграденото устройство и да я изпратите на компютъра за целите на показването.
2.) Трябва да изпратите команди, за да накарате сензора да стартира и спре поточно предаване на температурни стойности.
3.) Имате нужда от набор от команди, за да зададете различни аспекти във фърмуера, като скорост на поточно предаване, поточно предаване при стартиране, мигащи светодиоди и т.н.
4.) Имате нужда от някаква структура, за да изпратите сложни форми на данни към компютъра, може би набор от показания за напрежение на батерията.
Начини за постигане на това
Изглежда има няколко начина, по които хората са склонни да правят това:
API за прости низове:
Най-често срещаните, от работа със сензори на трети страни, изглежда използват прост API, базиран на низове, така че командите за стартиране и спиране на потоци може да бъдат съответно "SS,1\r" и "SS,0\r". В този случай ще трябва да четете от серийния порт, докато получите знака "\r" и след това да анализирате данните, които имате, за да видите дали има команда (вляво от запетаята) и параметри (вдясно от запетаята). Това работи за сценарии от 1 до 3 по-горе, но не прави сценарий 4 много лесен.
JSON String API:
Това работи по същия начин като горното, но вместо да предавате вашите параметри като прости стойности, вие подавате 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) за проверка на пълнотата на пакета, идентификатор за изпращане на последователни пакети (за предаване на масив от данни), масив от данни, който можем да използваме за пакетиране на longs, float, int и т.н. , и команден байт (CMD), който може да се използва от устройството, за да определи как да анализира полезния товар на данните (D0-D7).
Затова питам кой е най-предпочитаният начин за комуникация през сериен порт? Има ли други начини, които пропускам? Напоследък се занимавам много с уеб разработка и изглежда, че JSON е хубава абстрактна система за предаване, но има своите ограничения, защото трябва да правите много повече анализиране на низове, което е малко сложно от страна на фърмуера.