6

これが非常に漠然とした質問である場合は申し訳ありませんが、この問題を抱えている他の人を見つけるために適切に定式化できないようです. 主な問題は、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 は優れた抽象的な送信システムのようですが、ファームウェア側では少し複雑な、より多くの文字列解析を行う必要があるため、制限があります。

4

2 に答える 2

2

バイナリ パケット形式は、その見かけの単純さと効率性から魅力的です。さらに、いくつかの通信リンクはすでに固定サイズのパケットとしてデータを送信しています (USB、TCP/IP、ファイル システムなど)。

  • 人間が判読できない(難読化してプロトコルを保護したい場合を除きます:-))
  • コンピューター アーキテクチャに依存: エンディアンの問題について考える
  • ツールチェーンの依存関係: 例: コンパイラ X はコンパイラ Y に対してデータ構造をどのようにパックしますか?
  • リンクの依存関係: リンクが変更された場合、プロトコルのパケット サイズと新しいリンクのパケット サイズが一致しない場合はどうなりますか?

JSON は今の私のやり方です: ASCII データ送信はバイナリ送信よりも効率的ではありませんが、その利便性と移植性は、アプリケーションに厳しい帯域幅制限がない限り相殺されます。私は個人的に Arduino Uno ボード用の JSON パーサーを作成しましたが、システム スタックを含めて 2 kb 未満のデータ RAM で動作します。OK、深くネストされた JSON 送信で詰まる可能性がありますが、Twitter のツイート パケットから重要な要素を取り除くには十分であり、小さなシステムでも機能することが証明されました。

イヴ・マクドナルド

于 2013-10-25T03:42:23.230 に答える