組み込みからコンピュータへの通信に適したRS232ベースのプロトコル


10

私は、リモートのArduinoとコンピューターとの間のデータ通信を少し行うプロジェクトに取り組んでいます。ワイヤレス接続はXBeesのペアを介して行われるため、Arduinoとコンピューターの間にRS232リンクがあります。少量のデータの場合、いくつかの単純な通信プロトコルをまとめるのは簡単です。ただし、大規模なプロジェクトの場合、優れたシンプルな通信プロトコルにはどのようなものがありますか?

私は実行可能なオプションのように見えるMODBUSを見てきましたが、他にもっと良いオプションがあるかどうかを確認したいと思いました。


2
要件は正確には何ですか?

一般的な提案を探しています。シンプルさと低いオーバーヘッドがプロジェクトの主な目標です。
Computerish

1
申し訳ありませんが、私も意味しました:データの量、速度

私にはそのための定量的な測定値はありませんが、多くはなく、速度は大きな問題ではありません。
Computerish

7
それほど多くはなく、速度が問題ではないため、開発とデバッグがはるかに簡単になるため、人間が読めるものを強く主張しています。端末を接続して、リンクの両端を自分で置き換えることができると便利です。
Chris Stratton

回答:


4

OPは、「[データが多くない]と速度が大きな問題ではない」という状況の場合、シリアルプロトコルを要求します。OPで言及されているMODBUS RS-485を介したMODBUSは高速プロトコルではありません。これは仕様ではありませんが、ニッチについてのアイデアを提供します。

このニッチの一般的な標準プロトコルは2つだけ考えられます。

  • NEMA 0183。プレーンテキストASCIIプロトコル。人間が読める。ポイントツーポイントのみ。マルチドロップバスをサポートしていません。
  • OPですでに言及されているMODBUS

多くの場合、組み込みプログラマーがOPのような状況にある場合、独自のシリアル通信プロトコルをゼロから設計します。


10

一部の組み込みシステムプロトコルは、そのいくつかは非常に単純ですが、以下を含むEmbedded Systems:Common Protocolsにリストされています 。

おそらく、これらのプロトコルの1つは、そのまま、またはほんの少しの調整でアプリケーションに適しています。


6

私はあなた自身のものを投票し、それをできるだけ簡単に保ちます。

私はさまざまな制御アプリケーション用の多くのシリアルプロトコルを扱ってきましたが、次のことをお勧めします。

  • 他で使用されていない開始文字と停止文字
  • ある種のチェックサム/エラーチェック
  • フロー制御/シグナリングのいくつかの方法、特に双方向通信が必要な場合。

非常に基本的な例として、データをASCII文字に変換し、次のように開始/停止文字の中に貼り付けることができます。

バイト値0x7Aを送信する場合、送信されるデータは(7A)になります。()は選択された開始/停止文字で、7とAは2つのASCII文字です。OK、それは多くのオーバーヘッドを追加しますが、基本的なターミナルソフトウェアでデバッグできることを意味します。


5

データがXBeesを通過する場合は、モジュールをエスケープ文字を使用してAPIモードに入れ、データを論理パケットに分割し、APIモードでXBeeに渡されるパケットがそのまま到着するか、どういたしまして。1〜255バイトのチャンクの送信を中心にプロトコルを設計し、XBeeモジュールに各チャンク内のデータの配信方法を考慮させます。個々のパケットまたはそれらの間のサブディビジョンの整合性を維持することについて心配しないでください。Digiモジュールはそれをうまく処理するでしょう。心配する必要がある最大のことは、パケットを送信するノードが、それが配信されなかったと信じて交換を送信したとしても、受信者はとにかく、おそらく交換を受け取った後でも、それを受け取る可能性があるという事実です。片方が「マスター」になるようにプロトコルを設計すると、状況が最も簡単になる場合があります。マスターがデータの一部を要求する場合、スレーブはそれを1回送信し、マスターがそれを取得するかどうかを心配する必要はありません。マスターが必要なデータを取得できない場合は、再度要求できます。

スレーブはある種のシーケンス番号をデータに割り当て、マスターはシーケンス番号をスレーブが状態を変更する要求に割り当てる必要があります。マスターのリクエストの形式が「XXXより大きいシーケンス番号の最初のアイテムを送信する」であり、スレーブによる各データアイテムに独自のシーケンス番号と前のアイテムのシーケンス番号が含まれている場合(それらに連続番号が付いていない場合) )、遅れて到着するパケットはスレーブがマスターにデータを冗長的に送信する原因となる可能性がありますが、マスターは結果として生じる遅れて到着する応答を無視することに問題はありません。シーケンス番号が前の要求よりも小さい状態変更要求をスレーブが受信した場合、その要求は受信される前に置き換えられたため、その要求を無視する必要があります。


3

どの程度Firmata?さまざまなオペレーティングシステムとプログラミング言語をサポートしています。コントローラー側のArduinoとPICduinoがサポートされていますが、裸のマイクロコントローラーに移植するのは難しくありません。


3

私はこれと同様の質問があり、小さなAVRなどに十分なほど単純で小さいものは見つかりませんでした。そのため、CANに触発されたものを転がしました。それはMIN(マイクロコントローラー相互接続ネットワーク)と呼ばれます:

https://github.com/min-protocol/min

私はそれについてここにブログを書いています:

https://kentindell.wordpress.com/2015/02/18/micrcontroller-interconnect-network-min-version-1-0/

ブロックデータ用のフックがありますが、それは主にセンサー/アクチュエーターの信号を目的としています。信号を記述するためのJSON形式を定義し、MINフレーム内でのパッキングを定義しました。これを使用するWiresharkディセクタを取得したいと考えています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.