これが非常に漠然とした質問である場合は申し訳ありませんが、この問題を抱えている他の人を見つけるために適切に定式化できないようです. 主な問題は、2 つのデバイス間でシリアル接続が確立されたら、その接続をどのように使用して双方向通信を実装するかということです。
例が役立つ場合があります。マイクロコントローラーと C で記述されたファームウェアを使用する組み込みデバイスとして温度センサーがあるとします。そのセンサーからコンピューターへのシリアル ポート接続と、それとインターフェイスするためのコンピューター上のソフトウェア (C++ アプリケーションなど) があるとします。両側のシリアル ポートをセットアップし、2 つのデバイス間で 1 バイトのデータを読み書きする方法を理解しています。問題は、2 つのデバイス間の通信にどのような規則を使用するかということです。
要件が次のとおりであるとします。
1.) 組み込みデバイスから単一の温度読み取り値を取得し、それを表示目的でコンピューターに送信するコマンドを送信できる必要があります。
2.) センサーに温度値のストリーミングを開始および停止させるコマンドを送信する必要があります。
3.) ストリーミング レート、起動時のストリーム、LED の点滅など、ファームウェアのさまざまな側面を設定するには、一連のコマンドが必要です。
4.) 複雑な形式のデータをコンピューターに送信するには、ある種の構造が必要です。おそらく、バッテリー電圧の読み取り値の配列です。
これを達成する方法
人々がこれを行う傾向があるいくつかの方法があるようです:
単純な文字列 API:
サード パーティのセンサーを扱う最も一般的な方法は、ストリームを開始および停止するためのコマンドがそれぞれ「SS,1\r」および「SS,0\r」になるように、単純な文字列ベースの API を使用しているようです。この場合、「\r」文字を取得するまでシリアルポートから読み取り、取得したデータを解析して、コマンド (コンマの左側) とパラメーター (コンマの右側) があるかどうかを確認する必要があります。これは上記のシナリオ 1 から 3 で機能しますが、シナリオ 4 はそれほど簡単ではありません。
JSON 文字列 API:
これは上記と同じように機能しますが、パラメーターを単純な値として渡す代わりに、データの複雑な構造を表現できる JSON オブジェクトを渡します。したがって、バッテリー電圧の配列を JSON 配列として送信できます。この方法は、上記の 1 ~ 4 のすべてのユース ケースをカバーしているようです。ただし、JSON は文字列を送信し、埋め込み c を使用して解析するのは困難です。JSONデータを読み取るためのライブラリを持つJavaなどの高水準言語を使用できるコンピューター側にとっては、驚くべきことです。
パケット スタイル API:
これが私たちが受け入れた解決策であり、私は今ちょっと後悔しています。これには、送信するデータごとにバイトの構造化パケット規則を送信することが含まれます。パケット構造を以下に示します。
[0xFF][0xFF][ID][CMD][D0][D1][D2][D3][D4][D5][D6][D7][0xEE][0xEE][0xEE]
この構造を使用して、パケットの完全性を検証するためのヘッダーとフッター (0xFF と 0xEE)、シーケンシャル パケットを送信するための ID (データの配列を送信するため)、long、float、int などをパックするために使用できるデータ配列を送信します。 、およびデバイスがデータ ペイロード (D0 ~ D7) の解析方法を決定するために使用できるコマンド バイト (CMD)。
それで、シリアルポートを介して通信する最も好ましい方法は何ですか? 私が見逃している他の方法はありますか?私は最近、多くの Web 開発を行っています。JSON は優れた抽象的な送信システムのようですが、ファームウェア側では少し複雑な、より多くの文字列解析を行う必要があるため、制限があります。