Serial.begin():なぜ常に28800を使用しないのですか?

オンラインのサンプルコードの多くでは、セットアップブロックにSerial.begin(9600)という行を追加しています。

公式ドキュメントでSerial.begin()が何であるかを調べると、ビット/秒のデータ転送を制御していると書かれています。

つまり、明らかな質問です。最高の転送速度である28800を使用してみませんか?なぜ人々は9600に落ち着くのですか?ここでの制限は何ですか?

コメント

  • USBサポートに接続されたarduinoの最高値は実際には115200であり、57600が2番目に一般的です。ボーが表示されます。

回答

なぜ人々は落ち着く?

十分に速いので、人々は落ち着きます。最も一般的な使用法は、debuggin用に端末にいくつかのものを印刷することです。 9600ボーは、毎秒960文字、つまり毎秒12 x80文字の行です。どれくらい速く読むことができますか? 🙂

プログラムがバルクデータ転送にシリアルポートを使用している場合は、解決しないことを選択します。

とは制限…

シリアルの制限は高いです。プログラムで直接115200ボーを使用でき、それは問題なく機能します。 Arduinoターミナルでは最大115200が許可されますが、RealTermなどの他のプログラムではそれよりも高く実行できます。

ハードウェアシリアルは1Mボーまで実行されます。周りを読むと、UARTを直接制御することで最大1Mを使用していることがわかります。ブルートゥースチップを介した送信などの用途では、高いボーレートのメリットが得られる場合があります。ハードウェアシリアルインターフェイスを使用して、わずかな距離でチップ間を交換する場合は、1Mボーが完全に実現可能です。 1MHzのクロックレートで正常に動作するすべてのSPIおよびI2Cデバイスについて考えてみてください。

長距離では、ロジックレベル(プレーン0〜5V)の信号を使用するとノイズの問題が発生し始めます。より長い距離を使用するには、トランシーバーを追加して堅牢な信号を提供します。通常はRS-232で、あまり一般的ではありませんがRS-485です。 RS-232を使用すると、10 “フィートの距離でメガビットを実行できます。

マイクロプロセッサのクロック速度が実際の制限になります。ハードウェアUARTを使用する場合、プロセッサはUARTに1バイトをロードする必要があります。 10ビットごと(N81の場合)。したがって、1 Mボーに達すると、16MHzプロセッサがUARTにデータを供給し続けることが課題になります。160クロックティックごとに新しいバイトが送信されます。これは非常に少ない行です。短いデータバーストの場合、そのレートを達成できる可能性があります。メッセージは、UARTが制限になる前に、プロセッサの速度が不足することです。

注:これはすべて

HardwareSerial 、ソフトウェアシリアルは大きく異なります。

コメント

  • 2Mはhwシリアルでアーカイブ可能ですが、arduino 'の実装は遅すぎて大量のゴミを送信することに注意してください。速度を倍増させる魔法のビットを見つけるには、atmega328pdsを参照してください。また、9800ボーは非常に古い標準であり、多くのxbee、gpsなど、より多くのセンサーを構成できる場合でも、多くのセンサーがその値を標準として使用します。また、シリアルオーバーUSB使用の自動ボーレートネゴシエーションウィッチは、選択したボーデートをオーバーライドする場合がありますが、arduinoでは使用されていないと思います(ただし、leonardoで使用されている可能性があります)
  • 96008N1も事実上のデフォルト設定です。シリアルインターフェースを備えた多くのデバイスはこの設定で提供され、別の速度(またはデータビット、パリティビット、ストップビット)が必要な場合は構成する必要があります。
  • "それは十分に速いです"-良い答えですが、私はこの点にいくぶん同意しません。ほとんどのデバッグ出力の実装はブロックしているため、コード実行時間の過度の変更を防ぐために、デバッグ出力をできるだけ速くすることが非常に望ましいです。
  • '一括データ転送を行っています。理想的には' SPIを使用しますか?

回答

すべての興味深い回答に加えて、シリアル速度を XXX ビット/秒に設定することは必ずしも XXX ビットを意味する必要はないことを言及する価値がありますハードウェア上の/ s。

クロック(クォーツベースであっても)は不完全であり、ドリフトする可能性があります。さらに、シリアルクロックは通常、2の累乗の除数と(整数)カウンタを介して生成されるため、ベースクロック周波数ではすべての値を正確に取得することはできません。スタート/ストップビットの助けを借りて、非同期シリアル通信は、いくらかのクロックドリフトに耐えることができます。ただし、これには制限があります。

たとえば、ATmega328PAが1MHzで実行されている場合、0.2%のエラーで9600b / sを達成できます。ただし、14400b / sではエラーは-3.5%です(実際には13900b / sで通信しています)。また、28800b / sでは、エラーは+ 8.5%です(実際には31200b / sで通信しています)。これらの数値はすべて、 ATmega48PA-88PA-168PA-328PAデータシート、p200 からのものです。

これは、2つの同一のデバイスが相互に通信する場合の問題ではありません(実際には同じ速度で通信するため)。異なるデバイス間で通信する場合、問題になる可能性があります

基本周波数を上げても、精度が大幅に向上する必要はありません。たとえば、上記と同じATmega328PAを2MHzで実行しても、ほとんどの場合丸め誤差が原因であるため、実際には良い結果は得られません。しかし、1.8432MHzで実行すると、2400b / sから57.6kHzまでの非常に正確なbpsが得られます。

回答

これは最も遅い転送速度(300)ではなく、一部のセットアップ(28800または115200)で最終的に問題を引き起こす可能性のある転送速度を使用しないという一種の伝統。 PCのシリアルポート(ほとんどの場合、FTDI232 USBアダプター)はより高いレートに対応できますが、DIYハードウェアは対応できない場合があります。そのため、9600 bpsは、コード例のある種の標準転送速度としての地位を確立しています。

回答

時間の霧に立ち返る、リモートキーボードの「ゴールドスタンダード」(電話モデムを使用し、テレタイプを覚えている場合はテレタイプを使用)は9600ボーで、当初は専用の電話回線でのみ実現可能でした。時間はゆっくりと進みます。技術は急速に進歩します。そして記憶は時間よりもさらにゆっくりと動きます(そうです)。 9600ボーよりも数桁速く、少なくとも数メートル以上の距離で日常的に通信できます。かつてゴールドスタンダードと見なされていたものは、もはやゴールドではありませんが、それでもスタンダードと考えられています。

tl; dr:テクノロジーではなく、歴史です。

回答

人々がほとんどの場合9600を使用する主な理由は、それがArduinoIDEのデフォルトのボーレートであるためだと思います。また、シリアル信号が長距離を移動する必要がある場合は、高速のデータレートも信頼できない可能性があります。ただし、これが最適な速度として選択された理由はわかりません。

回答

人間の反応時間

Arduinoがポートでスラッシングしているときにシリアルモニターを停止できるためは100%の時間ユーザーに必要であり、最大転送速度は未満である必要があります 100%の確率で。

9600ボーは、「暴走したプロセスを簡単に殺す」と「煩わしいほど遅い」の間の妥協点です。

コメント

  • 100%ちょっと…面白い;)

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です