Serial.begin(9600)とは何ですか?

これは何かを初期化するためのものであることを知っています:

Serial.begin(9600); 

しかし、それが本当に何を意味するのか知っていますか?

コメント

回答

Serial.begin(9600)は実際には何も印刷しません。そのためには、Serial.print("Hello world!")を使用してテキストを印刷します”こんにちは世界!”シリアルコンソールに。むしろ、シリアル接続を9600ビット/秒で初期化します。

任意の種類を取得するには、シリアル接続の両側(つまり、Arduinoとコンピューター)が同じ速度のシリアル接続を使用するように設定する必要があります。わかりやすいデータの。 「2つのシステムが速度であると考えるものの間に不一致がある場合、データは文字化けします。

9600ビット/秒がArduinoのデフォルトであり、大多数のユーザーにとって完全に適切ですが、他の速度に変更することもできます:Serial.begin(57600)は、Arduinoを57600ビット/秒で送信するように設定します。コンピューターで使用しているソフトウェアを設定する必要があります(送信されているデータを確認するために、Arduino IDEのシリアルモニター)を同じ速度にします。

コメント

  • BaudとBPSは2つの異なるものです。 … '今探していたリンクが見つかりません。
  • "シリアルを配置するとどうなりますか.begin(0); "または" Serial.begin(4000); " 。数字の違いを知りたいのですが?
  • Serial.beginは、通信速度をビット/秒で設定するために使用されます。 1バイトは8ビットに相当しますが、シリアル接続は開始ビットと停止ビットを送信して、特定のバイトの開始と終了を受信システムに識別します。したがって、1文字を送信するには10ビットが必要です。 Serial.begin(0)を使用すると、Arduinoに0ビット/秒でシリアルと通信する必要があることを通知します。ご想像のとおり、これはArduinoがデータをまったく送信しないことを意味します。 Serial.begin(4000)を使用すると、Arduinoは4000ビット/秒でデータを送信します。これは非標準ですが、それ以外は問題ありません。
  • 要するに、数値を変更すると速度が変わります。数値を小さくすると(例:Serial.begin(300))、Arduinoがデータを送信する速度が遅くなります。それを増やすと、たとえば57600にすると、データの送信が速くなります。送信システムと受信システムの両方で、使用する速度について合意する必要があります。コンピュータの'のシリアルプログラム(Arduinoシリアルモニターウィンドウなど)を使用すると、速度を設定できます。コンピュータはデータを受信しますが、一般的な速度(300、1200、2400、4800、9600、19200、38400、57600、および11520ビット/秒)からのみ選択できます。 ' 4000などの他の速度を入力することはできません。通常は9600が適切です。
  • Baud and BPS are two different things... can't find the link I was looking for now.-ここ' 1つの説明:付録C:"ボー"と" bps "

回答

写真は1000ワードの価値があるので、(コンピューターを使用している場合は1024ワード)と言われるので、いくつかの写真を投稿します…

9600ボーで「Fab」を送信するようにUnoを設定し、ロジックアナライザで結果をキャプチャしました。

シリアル通信-3文字

赤で網掛けされた部分は、バイト間の「アイドル」期間です。

上の図から、 Tx(送信)データラインは通常、ハイ(1)で、ローになって文字(バイト)の開始を示します。これがスタートビットです。その後、8データビット(白い点で示されます) )ボーレート(1秒あたり9600サンプル)で表示されます。その後、ラインは再び高くなります。これがストップビット(赤い部分)です。次に、次の文字のスタートビットが表示されます。 「停止」部分は無期限に長くすることができますが、少なくとも1ビット長である必要があります。


最初の文字(文字「F」または0x46または0b01000110)の詳細は次のようになります。ここに表示:

シリアル通信-1バイト

  • A-データなし(Txがハイ)

  • B-「スタートビット」。文字(バイト)の送信が開始されていることを受信者に通知するために、行がローになります。受信機は、ラインをサンプリングする前に1.5クロック時間待機します。

  • C-最初の文字が到着します(文字「F」または0x46または0b01000110)。クロックビット自体はなく、着信データは単にボー(送信)レートでサンプリングされます。 SPI通信とは対照的に、データは最下位ビットから最初に到着します(1バイトあたり8ビットを送信しない場合)。したがって、(01000110ではなく)01100010が表示されます。

  • D-ストップビット。このバイトの終わりと次のバイトの始まりを確実に区別できるように、これは常にハイです。スタートビットは0で、ストップビットは1であるため、1バイトから次のバイトへの明確な遷移が常にあります。

  • E-のスタートビット次の文字。


ロジックアナライザのキャプチャから、T1 - T2が0.1041667ミリ秒であることがわかります。つまり、1/9600です:

1 / 9600 = 0.00010416666 seconds 

したがって、9600のレートでは、1秒あたりのビット数がわかります。 であり、その逆はビット間の時間間隔です。


その他の考慮事項

  • シリアル通信は(SPIやI2Cなどとは異なり)セルフクロックされないため、送信者と受信者の両方がクロックレートについて合意する必要があります。

  • Arduinoのクロックレートは正確ではありません。これは、ハードウェアがシリアルクロックを取得するためにシステムクロックを分周する必要があり、分周が常に正確であるとは限らないためです。ほとんどの場合、エラーが発生します。量はデータシートに記載されています(Unoなどの16 MHzシステムクロックで引用された数値):

    シリアルボーレートエラー

  • データビット数を変更できます。送信する必要はありません。そのうちの8つ、実際には5〜9ビットを送信できます。

  • オプションでデータビットの後にパリティビットを送信できます。

    • 「奇数」パリティを指定した場合、パリティビットは1ビットの総数が奇数になるように設定されます。
    • 「偶数」パリティを指定した場合、パリティビットは、1ビットの総数が偶数になるように設定されます。
    • パリティを指定しない場合、パリティビットは省略されます。

    これは、受信者がデータが正しく到着したかどうかを検出するのに役立ちます。

  • パリティビットはストップビットの前に送信されます。

  • (SeaTalkプロトコルで使用される)9データビットの場合、パリティビットは9番目のデータビットとして再利用されます。したがって、「9データビットとパリティビットの両方を持つことはできません。

  • 2つのストップビットを持つこともできます。これにより、基本的にバイト間の時間が長くなります。数日」これは、低速の電気機械装置が前のバイトを処理できるようにするためでした(たとえば、印刷するため)。


破損の可能性

ストリームの途中でシリアルデータのリッスンを開始すると、ストリームの途中の0ビットがスタートビットとして解釈され、その後、レシーバーがその後のすべてを誤って解釈する可能性があります。

これから回復する唯一の実際の方法は、これが発生しないように、時々(たとえば、10ビット長)十分に大きなギャップを設けることです。


反転ロジック

ここに示されているビット(ロジックレベル)は反転されていません。つまり、1ビットがHIGHで0ビットがLOWです。おそらく-12のようなものを送信するRS232機器がある場合1ビットの場合はV、0ビットの場合は+12 Vです。1つが小さいため、これは反転されます。ゼロ、電圧に関して。

そのようなデバイスがある場合は、電圧変換と論理反転を行う必要があります。 MAX232 のようなチップは両方を行います。また、ユーザーが用意したいくつかのコンデンサを使用して内部で生成することにより、このような機器の駆動に必要な-12Vを提供することもできます。


速度の経験則

1つのスタートビット、8つのデータビット、1つのストップビットで合計10ビットがあるため、簡単な経験則として、バイト数を計算できます。 ビットレートを10で割ると、1秒で送信できます。

例: 9600 BPSでは、毎秒960バイトを送信できます。


再現するコード:

 void setup() { Serial.begin(9600); Serial.print("Fab"); } void loop () { }  

回答

; TLDR;シリアル通信ポートを初期化し、ボーレートを設定します。通信しているデバイス(またはArduino IDEシリアルモニター)は、一致するボーレートに設定する必要があります。ポートを初期化したら、文字の送受信を開始できます。 Arduinoシリアルリファレンス

コメント

  • @Nickを減らしたり軽視したりしないでください- Gammon 'このトピックに関する優れた報道。

コメントを残す

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