UART通信概論

UART通信概論

 UARTとはUniversal Asynchronous Receiver Transmitterの略で日本語では調歩同期通信といいます。現場では「ユアート」と読んでいます。

 今となってはレガシーポートとも呼ばれますが、RS232CがUARTにあたります。最近のパソコンはUSBがありますので、RS232Cを搭載することは無くなりました。

 UARTの歴史はコンピュータの歴史といっていいほど、コンピュータのCPUが高価で1台のコンピュータをシェアして使っていた時代から存在する通信形式です。非常に簡単に通信できることから組み込みCPU等ではいまだに重宝されています。

3線通信

 UARTは下の図のように最低3本の線で通信ができます。

 これは最低限の接続方式で、かつ最も使われていると思われる接続方法です。よく、UART3線式。と呼ばれているのがこの接続方法です。この他にRTS信号やCTS信号をフロー制御に使う方法などがありますが、ほとんどが3線式で扱うので、フロー制御については軽く触れる程度にします。

 UARTは普通は上図のようにCPUとFPGAだったり、CPUとCPUだったり1対1の通信に使います。1対多の場合もありますが、かなり制御が複雑になります。1対1の場合、どちらが親。という事はありません。たとえば、USBであれば、親と子が決まっています。したがって、USBのケーブルは親と子の形が違うケーブルを採用しています。

 この1対1の通信で、接続する信号はTxとRxです。TxとRxというのは通信で良く使う記号で、Txが送信、Rxが受信を意味します。もう一度図を見てください。TxはRxと接続されていることに気が付いたでしょうか? このような接続方法をクロス接続といいます。

ハードウェアフロー制御

 UART通信で最も発生しやすいエラーがオーバーフローです。相手の事を考えないでデータを送り付けてしまうため、受信側が忙しすぎて、データを取りこぼしてしまいます。これを避けるために、RTS/CTSという信号を別に設けて、受信側の暇状況を監視しながら、送信を行う。というのがフロー制御です。受信側が暇なときにしか送信しないようにする。という制御です。このようにRTS/CTSの信号を別に設けてフロー制御する方法をハードウェアフロー制御といいます。

RTS信号が送信要求でCTSが送信可能です。次の図のようにRTSとCTSを対にして接続し、お互いのデータ要求を確認します。3線式に対応して5線式と呼ぶことがあります。

 RS232C通信でモデムを制御していた時代には良く使われましたが、最近はめっきり使わなくなったフロー制御です。接続する線が多くなるので敬遠されていますが、フロー制御としては優秀ですし、バイナリ通信でもフロー制御ができます。

ソフトウェアフロー制御

 必ずTxとRx同士が接続される事を利用して、受信側が送信を許可、停止できるように特別なコードをお互いにやり取りして制御する事ができます。具体的には送信許可の文字コードをXONとし、送信禁止の文字コードをXOFFとしてやり取りします。このようにXON\XOFFコードをやり取りする方法をソフトウェアフロー制御といいます。XON/XOFFコードは決まっていて、XONが11(hex)、XOFFが13(hex)を使います。したがって、ソフトウェアフロー制御ではバイナリ通信はできません。バイナリデータの中に11(hex)と13(hex)が含まれるからです。

フロー制御なし

 一番良く使われているのがフロー制御なしです。別名「垂れ流し」です。相手の事を考えないで、送りたいときに送るという方法です。受信側はひたすら受信するしかありません。受信が間に合わなくなったなら、それはオーバーフローエラーになります。と言っても、誰かがエラーと認識してくれるわけではないので、受信側でエラーを検出しなくてはならない。という二重苦の方式です。しかし、この方法が一番良く使われています。フロー制御なしの場合、3線式の接続で、なおかつXON/XOFFもありません。したがって、バイナリ通信でもASCII通信でもどちらでも可能です。

バイナリとASCII

 バイナリ通信とASCII通信を切り替えて扱うことは少なくなりました。いまは、設計の段階からどちらか一方に決めている場合がほとんどです。

 昭和の時代に、インターネットが無かった時、電話線を使ってモデムという機械を使ってパソコン(マイコンと呼ばれていた)同志を接続していました。電話を介して1対1の通信をしていました。この時にはバイナリ通信とASCII通信が混在していて、モードを切り替えていた事があります。

 今はASCII通信が多いと思います。私も人工衛星用の機器を開発した時にバイナリ通信で設計しましたが、その時だけでした。それ以外はASCII通信です。

 ASCII通信は通信データ量がバイナリ通信に比べて2倍になる。という欠点があります。しかしながら、普通にキーボードを叩いているとASCII文字なので、人が操作するにはわかりやすい。という利点があります。また、通信を行う時には、コマンド方式といって、命令+引数で通信するので、その体系を作りやすい。というメリットがあります。たとえば、

 ATDP 117[CR][LF]

というテキストを相手に送ると、ATDPは「電話をかける」117は電話番号。[CR][LF]はコマンド終わり。というように命令+引数+終了コードという体系で通信できます。

 この他に、オーバーフローしてしまっても、「コマンド終了」というコードを決めておけるので、1つのコマンドが失敗しても、次のコマンドを受けやすいのがASCII通信です。バイナリ通信は通信の終わりが分かりにくいので、一度オーバーフローを起こすと復帰するのに苦労します。