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


35

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

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

したがって、明らかな質問は、最高の転送速度である28800を使用してはどうですか?なぜ人々は9600に落ち着くのですか?ここでの制限は何ですか?


3
参考までに、USBサポートに接続されているarduinoの最高値は実際には115200であり、57600が2番目に多く見られるボーです。
BrettAM 14

回答:


48

なぜ人々は落ち着くのですか?

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

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

制限は何ですか...

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

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

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

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

これはすべてHardwareSerialに適用され、ソフトウェアシリアルは非常に異なることに注意してください。


2Mはhwシリアルでアーカイブ可能ですが、arduinoの実装は遅すぎて大量のゴミを送信するようです。atmega328p dsを参照して、速度を2倍にする魔法のビットを見つけてください。また、9800ボーは非常に古い標準であり、多くのセンサーは、xbee、gpsなどのようにさらに構成できる場合でも、その値を標準として使用します。また、USB経由のシリアル使用により、自動ボーレートネゴシエーションウィッチが選択されたボーレートをオーバーライドする場合がありますが、arduinoでは使用されないと思います(ただし、レオナルド上にある可能性があります)
14

1
9600 8N1も事実上のデフォルト設定です。シリアルインターフェイスを備えた多くのデバイスはこの設定で提供され、別の速度(またはデータビット、パリティビット、ストップビット)が必要な場合は構成する必要があります。
ピーターモーテンセン

「それは十分に高速です」-良い答えですが、この点には多少同意しません。ほとんどのデバッグ出力実装はブロックされているため、コード実行時間の過度の変更を防ぐために、デバッグ出力を可能な限り高速にすることが非常に望ましいです。
-Rev1.0

バルクデータ転送を行う場合、理想的にはSPIを使用しているでしょうか?
-tuskiomi

6

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

時計は、クォーツベースであっても、不完全でドリフトしやすいです。さらに、シリアルクロックは通常、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つの同一のデバイスが一緒に通信する場合(実際には同じ速度で通信するため)には問題ではありません。それは可能性が異なるデバイス間で通信する際に問題となります。

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


3

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


2

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

tl; dr:それは歴史であり、技術ではありません。


0

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


-2

人間の反応時間

ので、あなたのArduinoがポートでスラッシングされているシリアルモニターを停止することができることがユーザーによって100%の時間を必要とされ、最大転送速度が要求された未満 100%の時間を。

9600ボーは、「暴走プロセスを簡単に殺す」と「迷惑なほど遅い」間の妥協です。


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