UARTラインを見つける方法は送信データのために無料です


8

Rs485と通信するボードがいくつかあります。彼らは持っているATMegaようなシリーズのマイクロコントローラをatmega168patmega8。各ボードはいつでもデータを自由に送信でき、私はModbusの使用につながる制限があります。ボードの数は5〜10の範囲で指定できます。

私の問題は次のとおりです。ボードは、UARTラインが自由にデータを送信できるかどうかを確認し、バスがビジーであることを検出した場合、バスが空くまで待ってから独自のデータを送信できますか?

自動または手動で変更し、他のボードに回線がビジーであることを検出させる特別なフラグまたはレジスタはありますか?


2
このような状況は、RS485がCANに代わって廃止される多くの理由の1つになります。
ランディン2017

1
CANバスを使用する必要がありました。次に、レイヤ2バスの状態を追跡する必要があります。
Jeroen3 2017

回答:


22

半二重通信システムの最大の課題へようこそ。

RS-485はプロトコルではなく、半二重(*)差動リンクの電気的特性を定義する規格です。仕様書には、そのリンクを介してデータを送信する方法、または実際にリンクを使用する方法については何もありません。

このようなRS-485トランシーバーには、自動「ラインビジー」信号/フラグ/何もありません。また、RS-485ドライバーを組み込んだマイクロコントローラーも、外部トランシーバーに接続されたUARTコアを使用するマイクロコントローラーもありません。

フロー制御と方向制御のすべての実装は、使用するプロトコルに任されています。ModbusなどのRS-485ドライバーを使用するよく知られたプロトコルがいくつかあります。考えられるあらゆるプロトコルを実装することもできます。

あなたを助けるために、これらはプロトコルのためのいくつかのアイデアです:

  1. マスタースレーブタイプのプロトコルがあります。これには、バスを調整するマスターノードと、それぞれに一意の識別子を持つスレーブノードがあります。

    マスターノードが自分宛てのコマンドを明確に送信するまで、スレーブノードはデータを送信できません。スレーブがアドレス指定されると、スレーブは事前定義された方法でコマンドに応答できます。たとえば、固定長の応答パケットです。

    この場合、マスターがすべてを調整するために存在するので、同時に話したい複数のデバイスの問題を回避します。

  2. バス上の各デバイスが他のデバイスにデータを送信するための固定スロットを持っているような、何らかの形のスケジューリングを使用できます。スロットがなくなると、送信を停止し、次のデバイスが通信できるようにする必要があります。

    スケジューリングは、外部の調整なしでデバイス自体によって行うことができます。最初のデバイスが通信し、完了したことを示すメッセージを送信します。次のデバイス(たとえば、次に高いIDを持つデバイス)は、そのデバイスが移動できることを知っています。デバイスが応答しない場合は、タイムアウトが発生する可能性があります。これにより、スケジュール内の後続の各デバイスが発言できるようになります。まあ、私の前にデバイスからしばらく連絡がないので、今度は私の番です。


(*)2つの差動リンクを使用する全二重バージョンも定義していると思います。


OPが最大の課題であるマルチマスターセットアップでは、ネットスプリットの可能性を含め、新しく/再接続されたステーションを既存のステーションと同期させることです。
Janka 2017

おかげで、トムは...私はあなたの2提案方法のリードに1事...と思うマスタスレーブ方式送信者と受信者が使用して十分なresource..whileを持っている場合...その良い方法をatmega8、マイクロコントローラを、私はデバイス上の不安定さにそのリードを考えますパフォーマンス
2017

1
しかし、SOFEOFをフラグに使用して、回線がビジーであることをすべてのボードに通知すると、役に立ちます。しかし、特殊なボードに言って、宛先ボードのIDを置く必要があり、そのパケットそれはあなたのためである、いただきましたごopenion?
2017

@combo_ciパケットマーカー(たとえば、SOFを示すために先頭に追加されたバイト、およびEOFの最後のバイト)を使用して、バスがフレームの真ん中にあることを全員に通知し続けることができます。しかし、言うにはエラー/タイムアウト処理を追加する必要もあります。まあ、私は数秒/分/年前にSOFを取得しましたが、まだEOFを取得していません。また、2つのデバイスが同時に話そうとしないようにする方法を見つける必要もあります。
トムカーペンター

_2台のデバイスが同時に会話を試みないようにする方法を見つける必要もあります。_その私の質問:)私は.maybeは自分でimpliknetなければならないことを見つけるための標準的な方法がないと思います
アリ

9

軍や警察の無線通信とよく似ています。プロトコルが必要です。マスタースレーブは簡単で、ほとんどの場合に適しています。しかし、別のオプションは、人間のようにそれを行うことです:

  1. 聴く。
  2. 誰かが話す場合-待ってください。
  3. 誰も話さないと思うなら、話せます。
  4. 確認を待ちます。
  5. 確認が得られない場合は、もう一度お話しください。
  6. 放送したい場合は、すべての放送局に聞いて確認してください。
  7. あなたの声が聞こえない人と話したい場合は、リレーできる人がいるかどうか尋ねてください。

等々。実装するのは非常に興味深いかもしれません。幸運を!


これは、ネットワークで使用されていますen.m.wikipedia.org/wiki/...
マーティを

これは良い方法ですが、(何らかの理由で)ボードが私がバスがビジーであると完了したと言うことができる場合、そしてタイマーを使用してビジーでないことを検出すると、マイクロコントローラーへの追加のオーバーヘッドが発生するという問題があります。この問題を解決する方法はありますか?
2017

1
残忍な男の子があなたのデバイスをバラバラに壊す可能性もあります。すみません、すべて解決できるとは言いませんでした。
Gregory Kornblum 2017

😊ちなみに、多くのグレゴリー
アリ

問題、特にルーティングについて考える興味深い方法。
ダウンビート2017

3

ここにあなたのジレンマを解決するためのいくつかの可能性があります。

  1. トークンパッシングシステムを実装します。デバイスがトークンを持っている場合、それは限られた時間の間送信を許可されます。次に、トークンを次のデバイスに渡します。トークンを受け取って渡すことができない、欠落しているノードに対する準備を行う必要があります。
  2. 受信ラインを見てください。混雑している場合は、ランダムな遅延を生成して再試行してください。ランダムな遅延は、どのノードも送信ウィンドウを独占できないことを保証するのに役立ちます。それでも衝突は発生する可能性がありますが、チェックサム機能により、受信したパケットが損なわれていないかどうかを判別できます。完全な状態でない場合、受信側は再送信を要求できます。

開始番号1ウェイの場合、トークンはマスターとして機能するボードから送信する必要があります...単一のバスですべてのボードがトークンを受信します。トークンはどのようにボードに保持できますか?
2017

@combo_ciマスターを指定するか、最下位のバスアドレスなどを決定して、トークンの発信者と交渉できます。
Glenn W9IQ 2017

@combo_ciネットワーク上の特定のデバイスにそれを渡してみてください
seetharaman

2

ボードは、UARTラインが自由にデータを送信できるかどうかをどのように見つけることができますか?

一般的な答えは、ある種のプロトコルがなければ、確実に行うことができないということです。通常、コントローラーまたはアービトレーターを使用して、回線がビジーかどうかを確認します。簡単なのは、ODピンがインジケータラインを送信前に引き下げてから解放することです。そのラインを読み取ることにより、送信機はバスが利用可能かどうかを判断できます。

信頼性は低くなりますがシンプルなシステムは、バス電圧を統合することです(たとえば、ar / cネットワークを介して)。

バスがビジーであることを検出した場合は、バスが空くまで待ってから、独自のデータを送信しますか?

一般的なアプローチは、ランダムな時間待機してから再試行することです。


2

私はこのような私のデザインでこの問題を解決します:

代わりに2つのピンを通信に使用し、3つのピンを使用します。短距離で動作します。3番目のピンは回線使用中インジケータです。このピンはマスター側からプルアップされています。誰か(MCUなど)が話したいとき:

  • このピンの状態(INPUT)をチェックします。
  • ピンがHIGHの場合、ピンをLOWにします(出力)
  • そして話します。
  • メッセージが転送されると、ピン(INPUT)(ハイインピーダンス)が解放され、ピンがハイになります。
  • ピンがローの場合、しばらく待ってからピンサイクルのチェックに戻ります。

これはGregory Kornblumの回答の実装です。


2

modbusを使用したくない場合は、RS485上のマイクロコントローラー通信にオープンソースのBACnetプロトコルスタックを使用できます。基本的に、トークンリングトポロジやイーサネットと同様に、トークンを渡すだけで、各デバイスが送信できるタイミングを通知します。ここにあなたが始めるためのいくつかのリンクがあります:

http://www.chipkin.com/bacnet-mstp-installation-rs485-and-cables/ http://bacnet.sourceforge.net/


2

ソフトウェアフロー制御

ソフトウェアとハ​​ードウェアの両方のフロー制御には、ハンドシェイクタスクを実行するためのソフトウェアが必要です。このため、ソフトウェアフロー制御という用語は多少誤解を招きます。つまり、ハードウェアフロー制御を使用すると、通信ケーブルにハンドシェイク状態を通知する追加のラインが存在することになります。XON-XOFFフロー制御とも呼ばれるソフトウェアフロー制御では、標準の通信回線を使用してバイトが送信側に送信されます。

ハードウェアフロー制御を使用すると、送信側と受信側の間に多くの回線が存在する必要があり、ケーブルが太くて高価になります。したがって、通信で最大のパフォーマンスを得る必要がない場合は、ソフトウェアフロー制御が適切な代替手段となります。ソフトウェアフロー制御は、2つのデバイス間のデータチャネルを利用して、帯域幅を削減します。ほとんどの場合、帯域幅の減少はそれほど驚くべきことではなく、使用しない理由です。

ソフトウェアフロー制御で使用するために、2バイトがASCII文字セットで事前定義されています。これらのバイトは、送信を停止および再開できるため、XOFFおよびXONと呼ばれます。XOFFのバイト値は19です。これは、キーボードでCtrl-Sを押すことによってシミュレートできます。XONには、Ctrl-Qと同等の値17が割り当てられています。

ソフトウェアフロー制御の使用は簡単です。文字の送信を延期する必要がある場合、文字XOFFが回線で送信され、通信を再開するためにXONが使用されます。XOFF文字を送信しても、XOFFを発行したデバイスの方向の通信が停止するだけです。

この方法にはいくつかの欠点があります。1つはすでに説明されています。通信チャネルでバイトを使用すると、帯域幅を消費します。もう1つの理由はより深刻です。

ハンドシェイクは主に、最近受信したバイトを格納するために使用されるメモリ内のバッファであるレシーババッファのオーバーランを防ぐために使用されます。オーバーランが発生した場合、これは通信チャネル上の新しい文字の処理方法に影響します。ソフトウェアがうまく設計されていない最悪の場合、これらのキャラクターはチェックせずに捨てられます。このような文字がXOFFまたはXONである場合、通信の流れが著しく損なわれる可能性があります。送信者は、XOFFが失われた場合は新しい情報を継続的に提供し、XONが受信されなかった場合は新しい情報を送信しません。

これは、信号品質が悪い通信回線にも当てはまります。回線上のノイズのためにXOFFまたはXONメッセージが明確に受信されない場合はどうなりますか?送信される情報のXONまたはXOFF文字が情報バイトとして含まれていないことにも特別な注意が必要です。

したがって、ソフトウェアフロー制御を使用したシリアル通信は、通信速度がそれほど速くなく、バッファオーバーランまたはデータ損傷が発生する可能性が最小限である場合にのみ許容されます

高速CSMA

イーサネットCSMAキャリアセンスのような高速では、ランダムバックオフタイマーを使用した多重アクセス、衝突検出/回避が、最適化のための確率的確率のスループットについて分析されています。

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