シリアル通信は、データを1ビットずつ順番に送信する通信方式で、コンピュータや電子機器間、基板内の部品間で広く利用されています。本記事では、シリアル通信の基本であるUART(Universal Asynchronous Receiver/Transmitter)の仕組みや、各ビットの意味、エラーの原因、そしてシングルエンドと差動信号の違い、さらにRS232C、RS422、RS485との関連についてわかりやすく解説します。
UARTとは?
UART(Universal Asynchronous Receiver/Transmitter)は、シリアル通信を実現するためのハードウェアモジュールで、送信側と受信側の間でデータを非同期に送受信します。非同期通信とは、クロック信号を共有せずにデータを送る方式で、開始と終了を示すビットで同期を取ります。つまり、開始を示すビットが来るまでは受信側はただ待ち続け、開始されると動き出します。この様子から「調歩同期」とも呼ばれます。
ちなみにUSARTというものもあります。これはUARTの機能に加えて、クロック同期シリアル通信ができるモジュールです。
UARTの基本構造
UART通信では、以下のビットが順番に送信されます。スタートビットからストップビットまでの全体を「フレーム」といいます。フレームのサイズは全体のビットサイズの合計になります。
1回の通信は1フレーム毎に区切られます。つまり最大でも8ビットずつしか送受信できません。
スタートビット
受信側に通信の開始を示すビットで、通常は0が固定で送られます。ビットサイズは1ビットです。
データビット
送信したいデータそのものです。5~8ビットのサイズがありますが、最近はほぼ8ビットです。
パリティビット(省略可)
データの誤りを検出するためのビットで、偶数パリティや奇数パリティが選択可能です。ビットサイズは1ビットです。
データビットとパリティビットのうち1であるビットを数え、それが偶数であるか奇数であるかで誤りを検出します。「偶数パリティ」を設定しているときに、数えた結果が奇数であればおかしい、ということです。同時に2つのビットが異常になると検出できなくなるなど、検出精度はあまり高くはありません。
ストップビット
受信側に通信(フレーム)の終了を通知するためのビットで、1が固定で送られます。ビットサイズは1~2ビットです。1.5ビットという変わったサイズを設定することができますが、最近はビットサイズは1であることがほとんどです。
ここまでの構成と、通信速度が送信側と受信側で一致していないと正しく通信できません。
設定項目
UARTには次のような設定項目があります。これらが送受信側で一致していないと、正しく通信できません。
送受信側で一致していないとき、設定項目に応じたエラーが出るとは限らないことに注意が必要です。(後述します)
ボーレート
UARTの通信速度はボーレートと呼ばれます。昔は「ボー(baud)」というのが速度の単位でしたが、現在は「bps(bits per second)」と同義になっています。RS232Cという規格の名残で、9600bpsや115200bpsのような半端に思える数値がよく使われます。
基板内の部品間通信に使う場合は自由度が高く、1Mbps程度までなら高速化できます。
この設定値はボーレートクロックに依存しますが、ボーレートクロックはCPUの内部クロックから作られるため、送受信側それぞれが違うCPUを使っている場合などはボーレートクロックが一致しないことがあります。このときは見かけ上の設定速度が同じなのに通信できない、ということが起こります。
ボーレートクロックの正確な数値を算出し、双方で誤差がおよそ±10%以内になることが目安です。
パリティ
偶数か奇数か、あるいはそもそもパリティチェックをしない(パリティビットが省略される)かを設定します。
ストップビット
ストップビットの幅を設定します。1、1.5、2から選べます。
UARTのエラー
UARTで検出できるエラーと、その原因、対策について解説します。UARTのエラーは必ず受信側で発生します。
ボーレートの食い違いは直接検出できません。ボーレートが違うとフレーム内のビット解釈がズレるため、結果としてパリティエラーになったり、フレーミングエラーになったりします。早めにオシロスコープで実際の速度を確認しておかないと、本当の原因がわかりにくくなります。
パリティエラー
パリティは、データビットとパリティビットのうち1であるビットを数え、それが偶数であるか奇数であるかで誤りを検出します。その結果、期待と異なるものであればパリティエラーになります。
パリティの設定で「パリティ無し」にしたときは、このエラーは発生しません。
ボーレートが食い違ってビットがズレたときもこのエラーが発生することがあります。
ボーレートを合わせましょう。またパリティの設定を確認しましょう。それでも発生する場合は電気的なノイズが原因です。
フレーミングエラー
ストップビットが来るはずのタイミングで、ビットが0だったときに発生します。ストップビットは設定で決められたビット幅分、1でないといけませんが、その幅が不足していたときもこのエラーになります。
ボーレートが食い違ってビットがズレたときもこのエラーになります。
通信線が断線して0に固定になっていたりすると必ず発生します。
ボーレートを合わせましょう。ストップビットの設定を確認しましょう。それでも発生する場合は電気的なノイズか、配線に問題があります。
オーバーランエラー
UARTの通信モジュール内に受信データが残っている状態で、次の受信データが来てしまうとこのエラーになります。
何らかの原因でソフトウェアの受信処理が遅れるとよく発生するエラーです。ソフトウェアのミスであることが非常に多いです。
受信処理が適切なタイミングで動作していることを確認しましょう。割り込みの優先順位が低いと発生しやすくなります。
電気的なノイズにより、通信線が一瞬0になるせいでスタートビットと誤認してしまうことがあります。そのせいでゴミデータを「受信」してしまうと非常に厄介です。パリティ無しの設定だと検出できないので、ゴミデータ(多くは「0xFF」)の対策をしておくとよいでしょう。
対策
エラーが起こらないようにするために、次の内容を確認しましょう。
- 電気的なノイズの対策
- 設定を一致させていること
- パリティだけでなく、CRCを使うなどしてエラー検出手段を増やす
- 差動信号を使う
シングルエンドと差動信号
UARTの通信線には、シングルエンドと差動信号を使うことができます。それぞれの特徴を以下に解説します。
シングルエンド
送信と受信にそれぞれ1本の配線を用いる方式です。GNDを基準とした電圧で1か0かを判別します。
配線が少ないので低コスト
ノイズに弱い。長距離伝送に不向き
差動信号
送信と受信にそれぞれ2本の配線を用いる方式です。2本の配線の差分によって1か0かを判別します。
ノイズに強く、長距離・高速伝送が可能
配線が多くなるため高コスト
RS-232C、RS-485、RS-422について
これらの規格はコネクタ形状やコネクタのピン配置、通信線の電圧レベルや構成を定めたもので、通信方式はどれもUARTです。それぞれの違いを表にまとめました。差動信号を使っているものは大幅に伝送距離が伸びていることがわかると思います。
自動車に使われているCANという通信規格は、RS-485がベースになっています。
RS-232C | RS-422 | RS-485 | |
---|---|---|---|
通信方式 | シングルエンド | 差動信号 | 差動信号 |
最大伝送距離 | 約15m | 約1200m | 約1200m |
特徴 | 低速通信、ノイズに弱い | 高速通信、ノイズ耐性が高い | 最大32台のデバイスを接続可能 |
用途 | PCのシリアルポートなど | 産業機器間の通信 | 複数機器間のネットワーク通信 |
CPUに搭載されているのはあくまでもUARTというモジュールです。これらの規格に対応するには、別途トランシーバーICが必要になります。
まとめ
シリアル通信は、そのシンプルさと汎用性から、さまざまな電子機器で利用されています。UARTの基本や各種ビットの役割、エラーの原因と対策を理解することで、より安定した通信システムを構築できます。また、シングルエンドと差動信号の違いや、RS232C、RS422、RS485といった通信規格を正しく選択することで、用途に応じた最適な通信環境を実現できます。
よくある疑問
シリアル通信とパラレル通信の違いは何ですか?
シリアル通信はデータを1ビットずつ順番に送信しますが、パラレル通信は複数のビットを同時に送信します。シリアル通信は長距離通信やコスト面で有利です。
ボーレートとは何ですか?
ボーレートは、1秒間に送信されるビット数を表す通信速度の単位です(bps)。送信側と受信側で同じボーレートを設定する必要があります。
UARTはなぜ非同期通信なのですか?
UARTはクロック信号を共有せず、スタートビットとストップビットでデータフレームの開始と終了を示しているため「非同期通信」と呼ばれます。クロック信号のための配線が不要になるためコストを抑えられますが、クロック信号を使った「同期通信」の方が速度面では有利です。