シンプルなシリアルポイントツーポイント通信プロトコル 質問する

シンプルなシリアルポイントツーポイント通信プロトコル 質問する

2 つのデバイス (PC とマイクロコントローラ) 間のシンプルな通信プロトコルが必要です。PC はマイクロにいくつかのコマンドとパラメータを送信する必要があります。マイクロはバイト配列 (センサーからのデータ) を送信する必要があります。

データはノイズ保護(パリティ チェックの他に、他のデータ修正方法が必要だと思います)。

これを行うための標準的な解決策はありますか? (完全な解決策ではなく、アイデアだけが必要です)。

PS アドバイスがあれば幸いです。PPS 文法上の間違いがありましたら申し訳ございませんが、ご理解いただければ幸いです。

編集1。それがマスター/スレーブプロトコルまたは両側が通信を開始できます。PC は、マイクロがジョブを完了してデータを送信できるタイミングを認識する必要があります。PC は、データの準備ができているかどうかをマイクロに継続的にポーリングするか、ジョブが完了したときにマイクロがデータを送信できます。どちらがより優れていて簡単かはわかりません。

編集2。 ハードウェアと物理層プロトコル。以来RS-232PCで使用されているCシリアル規格を使用します非同期通信. RxD、TxD、GND信号のみを使用します。マイクロコントローラがサポートしていないため、追加の配線は使用できません。ちなみに、私はAVRATmega128チップ。

したがって、固定ボー レート、8 ビットのデータ、2 ストップ ビットをパリティ チェックなしで (またはパリティ チェックありで?) 使用します。

データリンクプロトコルそれが私の質問の主旨です。提案していただきありがとうございます高解像度LCPPPP(官民パートナーシップ)そしてモドバスプロトコル。調べてみます。

ベストアンサー1

私は使うだろう高解像度LC過去にはうまくいったことがあります。ポイントツーポイントシリアルの場合は、非同期フレーミング他の制御機能については、おそらくやり過ぎになるので忘れてください。

パケットのフレーミングにHDLCを使用するほか、パケットを次のようにフォーマットします。これは、802.11を使用してオプションを渡す方法です。

U8 cmd;
U8 len;
u8 payload[len];

各コマンドパケットの合計サイズは len +2 です。

次に、次のようなコマンドを定義します。

#define TRIGGER_SENSOR 0x01
#define SENSOR_RESPONSE 0x02

もう 1 つの利点は、新しいコマンドを追加できることです。また、未定義のコマンドを無視するようにパーサーを正しく設計すると、ある程度の下位互換性が確保されます。

すべてをまとめると、パケットは次のようになります。

 // total packet length minus flags len+4
 U8 sflag;   //0x7e start of packet end of packet flag from HDLC
 U8 cmd;     //tells the other side what to do.
 U8 len;     // payload length
 U8 payload[len];  // could be zero len
 U16 crc;
 U8 eflag;   //end of frame flag

システムはシリアル ストリームを監視してフラグ 0x7e を探し、フラグがある場合は長さをチェックして、pklen >= 4 かつ pklen=len+4 であり、CRC が有効であることを確認します。小さなパケットの場合は、CRC だけに頼らないでください。誤検知が多く発生するため、長さも確認してください。長さまたは CRC が一致しない場合は、長さと CRC をリセットして、新しいフレームのデコードを開始します。一致する場合は、パケットを新しいバッファーにコピーして、コマンド処理関数に渡します。フラグを受信した場合は、常に長さと CRC をリセットします。

コマンド処理関数では、cmd と len を取得し、スイッチを使用して各タイプのコマンドを処理します。また、特定のイベントが応答を送信して、システムがイベント駆動型のリモート プロシージャ コールのように動作するようにする必要があります。

たとえば、センサー デバイスにはタイマーを設定したり、読み取りコマンドに応答したりできます。その後、パケットをフォーマットして PC に送信し、PC はパケットを受信したことを応答します。応答しない場合は、センサー デバイスはタイムアウト時に再送信できます。

また、ネットワーク転送を行う場合は、次のようなネットワークスタックとして設計する必要があります。OSI モデルとしてフォアデッカーポイントを忘れないでください物理層のもの私のHDLCに関する投稿はデータリンク層そしてそのRPCとコマンド処理はアプリケーション層です

おすすめ記事