Prismjs

2019年10月12日土曜日

シリアル通信・UART・RS232C・RS422・RS485とは

シリアル通信とは

シリアル通信とは規定のタイミングで1ビットごとに1本の線にデータを乗せてやり取りをする通信のこと。SPI通信やI2C通信もシリアル通信の一種である(SCLK等はデータを乗せる線ではなくタイミングを制御するための線なため)。
しかし、単にシリアル通信と言うとたいていがUARTを用いた調歩同期式(非同期式)の通信のこと、もしくはRS232Cでの通信のことを指すことが多い。




UARTとは

UARTはUniversal Asynchronous Receiver/Transmitter の頭文字をとったもの。単にUARTというと調歩同期式のシリアル通信の規格の名称(SPIやI2Cみたいな規格の名称)という意味で使われることが多いが、本当は調歩同期式のシリアル通信とパラレル通信を相互に変換(CPU⇔外部デバイスの通信)するための集積回路(つまり規格のことではなくハードウェア)のことを指す。
面倒なので以降のUARTという文言は集積回路のことではなく調歩同期式のシリアル通信を指す言葉として使う。


UARTの規格・信号線について

UARTは基本的に1対1の機器間の通信に使われるもので、どっちがマスターでどっちがスレーブというような主従関係はない。通信に必要な線はTXDとRXD(とGND)である。一方通行の通信しかしないのであればTXD かRXDどちらか(とGND)の線のみで通信可能。
TXD端子は送信(out)、RXD端子は受信(in)となり、TXDを接続先のRXDに、RXDを接続先のTXDに接続する。


UARTのデータ形式

以下の図のようなデータ形式で8bit(設定によっては稀に7bit)区切りで通信が行われる。

1bitの時間幅はボーレートで決まる。例えばボーレートが9600bpsなら1bitの時間幅は1/9600秒=約104μ秒となる。
通信は必ずスタートビットから始まり、ストップビットで終わる。つまり8bit(7bit)の情報を送るために10bit(9bit)のデータを送る必要がある。
TXD(送信側)は非通信時は常にHIGHであるが、データ送信開始時に1bitの時間幅だけLOWになる。これがスタートビットに当たる。受信側はこのスタートビット時の立下りを監視しており、スタートビット検出後にボーレートに合わせたタイミングでデータを取り込むことで適切なデータを受け取ることができる。
スタートビット後はデータに合わせてボーレートのタイミングでHIGH/LOWが変化する。
ストップビットはデータ送信の終了を示すために、データ送信終了後にTXDを1bit幅分(設定によっては2bit幅分)HIGHにする。なぜストップビットがあるのかというと、ストップビットがないと、連続して通信を行っているときに最後のデータがLOWだった場合、次のスタートビットを検出できないからだ。

設定によっては8bitのデータの後にエラー検出のためのパリティビットが追加される。パリティビットの意味についてはここでは説明しないのでググってください。


つまり上記より、UARTにおいて、通信する機器間で最低限合わせておく必要がある設定項目はボーレート、パリティの有無と偶奇、データのbit数(8bitか7bitか)となる。

例えばボーレートが9600bps、パリティ有、データ8bitのときに通信にかかる時間は、
(1/9600)×11=約1.15m秒ほどかかることになる。逆に言えば、1秒当たり約870byteの通信が可能と言える。

受信側がデータを取り込むタイミングは、ボーレートから計算した各bitの時間幅の真ん中付近になるようになっているため、わずかなボーレートのズレ(だいたい3%くらい)ならば正常に通信できる。
スタートビットのおかげで1byte通信ごとにボーレート誤差の積算はリセットされる。


RS232C・RS422・RS485とUARTの関係

UARTとRS232Cはよく混同され、中にはUARTとRS232Cを同義と考えている人もいる。
UARTは調歩同期式のシリアル通信のこと(もしくはそれを行うための集積回路のこと)であり、RS232Cは通信時の物理層(電圧閾値とか、差動かどうかとか)の規定のことである。
RS232Cは物理層の規定なので、通信プロトコルは必ずしも調歩同期式のシリアル通信でなければいけないわけではないが、一般的によく用いられるのは調歩同期式のシリアル通信である。(つまり、RS232CでTCP/IPのプロトコルを用いることも可能である)
UARTの電圧は定義されていないので、UART(集積回路のほう)の動作電圧によって3.3VがHIGHだったり5VがHIGHだったり1.8VがHIGHだったりする。例えばArduino UNOは5V、ラズパイは3.3VのUARTなのでArduino UNO-ラズパイでUART通信するときは電圧レベル変換が必要になる。
RS232Cは前述のとおり物理層の規定なのでしっかりとした取り決めがあり、+3~+15VがHIGH、-3~-15VがLOWと閾値が決められている。またRS232CとUARTは論理が逆である。
つまりUARTとRS232Cを直でつなげると最悪の場合デバイスがぶっ壊れる。
RS232Cの仲間にRS422などがある。
RS232Cの最大通信速度は電圧の幅の大きさがボトルネックになっていたが、それを改良するためにRS232Cより低電圧&差動信号でやり取りするようにしたのがRS422である。低電圧化のために通信速度が向上し、差動信号のおかげでノイズにも強くなり最長1.2kmで通信できるようになった。
RS422は1対多数でしか通信できなかったのを、通信線をハイインピーダンスにもできるようにして、多数対多数で通信できるように改良されたのがRS485である。RS422とRS485は動作電圧が同じなので物理的な互換性がある(RS422の上位互換がRS485。RS485は下位互換性があるといえる)が、RS232Cとは物理的な互換性はない。
UARTもRS232CもRS422もRS485もプロトコルが調歩同期式のシリアル通信ならば電圧閾値などが異なる(物理層が異なる)だけである。そのため変換ICなどをかませれば簡単にUART-RS232CやUART-RS422、RS422-RS232Cなどの異なる規格間で通信ができる。
UART-RS232Cの変換ICはmaxim社のMAX232シリーズが定番のようである。これらの変換ICやそれを用いた変換基板・モジュールはたくさん発売されている。
要点をまとめると、UARTはいろんな動作電圧があるので注意すること、RS232C・RS422・RS485は正確には物理層の規定のことである、RS485はRS422の上位互換で下位互換性がある、RS232CとRS422・RS485は互換性がない。

0 件のコメント:

コメントを投稿