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


22

私はこれが何かを初期化することであることを知っています:

Serial.begin(9600);

しかし、私はそれが本当に何を意味するのか知りたいですか?


3
ドキュメントには、適切な説明があります。arduino.cc/en/Serial/begin
sachleen

回答:


22

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

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

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


2
ボーとBPSは2つの異なるものです...今探していたリンクが見つかりません。
匿名のペンギン

「Serial.begin(0);」と入力するとどうなりますか または「Serial.begin(4000);」。数字の違いは何ですか?
shajib0o

3
Serial.beginを使用して、通信速度をビット/秒で設定します。1バイトは8ビットに相当しますが、シリアル接続は開始ビットと停止ビットを送信して、特定のバイトの開始と終了を受信側システムに識別します。したがって、1文字を送信するには10ビットが必要です。を使用するSerial.begin(0)と、Arduinoに、毎秒0ビットでシリアルと通信する必要があることが伝えられます。ご想像のとおり、これはArduinoがデータを送信しないことを意味します。 Serial.begin(4000)Arduinoは4000ビット/秒でデータを送信します。これは非標準ですが、それ以外は問題ありません。
heypete

2
要するに、数を変更すると速度が変わります。数値を小さくすると(たとえばSerial.begin(300))、Arduinoのデータ送信が遅くなります。たとえば、57600に増やすと、データがより速く送信されます。送信システムと受信システムの両方で、使用する速度について合意する必要があります:Arduino Serial Monitorウィンドウなどのコンピューターのシリアルプログラムでは、コンピューターがデータを受信する速度を設定できますが、一般的な速度: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」
ニックギャモン

21

写真は1000ワードの価値があるので、彼らは言う(あなたがコンピューターで作業している場合は1024ワード)ので、私はいくつかの写真を投稿します...

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

シリアル通信-3文字

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

上記の図から、Tx(送信)データ行は、文字(バイト)の開始を示すために低下するまで通常は高(1)であることに注意してください。これが開始ビットです。次に、8個のデータビット(白い点で示される)がボーレート(9600サンプル/秒)で表示されます。その後、ラインは再びハイになります。これはストップビット(赤い部分)です。次に、次の文字の開始ビットなどが表示されます。「停止」部分は無期限に長くなる可能性がありますが、少なくとも1ビット長でなければなりません。


最初の文字(文字「F」または0x46または0b01000110)の詳細は、次のとおりです。

シリアル通信-シングルバイト

  • A-データなし(Txが高い)

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

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

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

  • E-次の文字の開始ビット。


ロジックアナライザのキャプチャから、T1 - T20.1041667ミリ秒であり、実際には1/9600であることがわかります。

1 / 9600 = 0.00010416666 seconds

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


その他の考慮事項

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

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

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

  • データビットの数を変えることができます。8ビットを送信する必要はありません。実際、5〜9ビットを送信できます。

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

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

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

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

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

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


破損の可能性

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

これから回復するための唯一の本当の方法は、これが起こらないように、時々十分な大きさのギャップ(例えば、10ビット長)を持つことです。


反転ロジック

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

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


経験則

開始ビット1つ、データビット8つ、停止ビット1つで合計10ビットであるため、おおまかな目安として、ビットレートを10で除算することで1秒間に送信できるバイト数を計算できます。

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


再現するコード:

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

void loop ()
  {
  }

1

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


@ Nick-Gammonのこのトピックに関する優れた報道を損なったり、軽視したりしないでください。
linhartr22

-3

コンピューターシステム内で動作するプログラムを指定します。数値はspeed.Serial.printを指定し、表示されるテキストを指定します。


3
これは現在受け入れられている答えに何を追加しますか?
イグナシオバスケス-エイブラムス

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