

ユニバーサル非同期送受信機(UART / ˈ juː ɑːrt /)は、非同期シリアル通信用の周辺機器で、データ形式と伝送速度を構成できます。UARTは、開始ビットと停止ビットで囲まれたデータビットを、最下位から最上位の順に1ビットずつ送信し、通信チャネルで正確なタイミングが処理されます。電気信号レベルは、UART外部のドライバ回路で処理されます。一般的な信号レベルは、短いデバッグリンク用のRS-232、RS-485、および生のTTL [ 1 ]です。初期のテレタイプライターは電流ループを使用していました。
これは初期のコンピュータ通信機器の一つで、テレタイプライターをオペレーターコンソールに接続するために使用されました。また、インターネットの初期のハードウェアシステムでもありました。
UARTは通常、集積回路(IC)に実装され、コンピュータや周辺機器のシリアルポートを介したシリアル通信に使用されます。マイクロコントローラチップには、1つまたは複数のUART周辺機器が一般的に統合されています。自動車、スマートカード、SIMカードなどには、専用のUARTが使用されます。
関連デバイスである汎用同期・非同期送受信機(USART)も、同期動作をサポートしています。
初期の電信方式の中には、可変長パルス(モールス信号など)と回転式時計仕掛け機構を用いてアルファベット文字を送信するものがあった。最初のシリアル通信装置(固定長パルスを使用)は、回転式機械スイッチ(整流子)であった。5、6、7、または8ビットのデータを用いた様々な文字コードがテレプリンターで一般的になり、後にコンピュータ周辺機器としても普及した。テレタイプライターは、小型コンピュータ用の優れた汎用入出力装置となった。
DECのゴードン・ベルは、 PDP-1から始まるPDPシリーズのコンピュータ向けに、ラインユニットと呼ばれる回路基板全体を占める最初のUARTを設計した。[ 2 ] [ 3 ] ベルによれば、UARTの主な革新は、サンプリングを使用して信号をデジタル領域に変換したことであり、手動で調整するポテンショメータを備えたアナログタイミングデバイスを使用した以前の回路よりも信頼性の高いタイミングが可能になった。[ 4 ]配線、バックプレーン、その他のコンポーネントのコストを削減するために、これらのコンピュータはハードウェアワイヤではなく、 XONおよびXOFF文字を使用したフロー制御も先駆的に採用した。
DECはラインユニットの設計を自社用に初期のシングルチップUARTに凝縮した。[ 2 ] Western Digitalはこれを発展させ、1971年頃に広く普及した最初のシングルチップUARTであるWD1402Aを開発した。これは中規模集積回路の初期の例である。もう1つの人気のあるチップは、 Signetics 2650ファミリーのSCN2651である。
1980年代初頭のUARTの例としては、初代IBM PCの非同期通信アダプタカードで使用されたNational Semiconductor 8250が挙げられる。 [ 5 ] 1990年代には、オンチップバッファを備えた新しいUARTが開発された。これにより、データ損失がなく、コンピュータによる頻繁な監視も必要とせずに、より高速な伝送が可能になった。例えば、人気のNational Semiconductor 16550は16バイトのFIFOを備えており、 16C550、16C650、16C750、16C850など、多くの派生製品が生まれた。
メーカーによって、UART 機能を実行するデバイスを識別するために使用される用語は異なります。Intel は、実際には USART であり、同期動作と非同期動作の両方が可能であったため、8251デバイスを「プログラマブル通信インターフェース」と呼んでいました。これは 1979 年に発表されました。 MOS Technology 6551 は、「非同期通信インターフェースアダプタ」(ACIA)という名前で知られていました。 「シリアル通信インターフェース」(SCI)という用語は、他社が UART と呼んでいたスタート/ストップ非同期シリアルインターフェースデバイスを指すために、1975 年頃にMotorolaで初めて使用されました。 Zilog は、多数のシリアル通信コントローラ(SCC)を製造しました。
2000年代以降、ほとんどのIBM PC互換コンピュータは外部RS-232 COMポートを廃止し、より高速にデータを送信できるUSBポートを使用するようになりました。RS-232シリアルポートがまだ必要なユーザー向けには、現在では外部USB-UARTブリッジが一般的に使用されています。これらはハードウェアケーブルとチップを組み合わせてUSBとUARTの変換を行います。Cypress SemiconductorとFTDIは、これらのチップの主要な商用サプライヤーの2社です。[ 6 ]ほとんどのコンピュータの外部ではRS-232ポートは利用できなくなりましたが、多くの内部プロセッサにはUARTがチップに組み込まれており、ハードウェア設計者はRS-232またはRS-485を使用して通信する他のチップやデバイスとインターフェースすることができます。
UARTは以下のコンポーネントで構成されています。
ユニバーサル非同期送受信機(UART)は、バイト単位のデータを受け取り、個々のビットを順次送信します。[ 7 ]宛先では、2番目のUARTがビットを完全なバイトに再構成します。各UARTにはシフトレジスタが含まれており、これはシリアル形式とパラレル形式間の変換の基本方式です。デジタル情報(ビット)を単一のワイヤまたはその他の媒体を介してシリアル送信する方が、複数のワイヤを介してパラレル送信するよりもコストが低くなります。
UARTは通常、異なる機器間で使用される外部信号を直接生成または受信しません。UARTの論理レベル信号を、標準化された電圧レベル、電流レベル、またはその他の信号である外部信号レベルに変換するために、別のインターフェースデバイスが使用されます。
コミュニケーションには3つのモードがあります。
UARTを動作させるには、送信側と受信側の両方で以下の設定が同じである必要があります。
電圧レベルに関しては、2つのUARTモジュールは両方とも同じ電圧レベル、例えば2つのUARTモジュール間で3V-3Vであれば正常に動作します。異なる電圧レベルで2つのUARTモジュールを使用する場合は、外部にレベルシフト回路を追加する必要があります。[ 8 ]

UARTフレームは5つの要素で構成されます。
最も一般的な設定である8データビット、パリティなし、1ストップビット(つまり8N1)の場合、プロトコル効率は8/10 = 80%です。比較のために、ペイロード1500バイトの最大スループットフレームを使用した場合のイーサネットのプロトコル効率は最大95%、9000バイトのジャンボフレームを使用した場合最大99%です。ただし、イーサネットのプロトコルオーバーヘッドと最小ペイロードサイズ42バイトのため、1バイトまたは数バイトの小さなメッセージを送信する場合、イーサネットのプロトコル効率はUARTの8N1の一定効率80%よりもはるかに低くなります。
データ送信のないアイドル状態では、高電圧状態、つまり電源が供給されています。これは電信時代の名残で、回線と送信機が損傷していないことを示すために、回線を高電圧に保持していたことに由来します。
各文字は、論理ローのスタートビット、データビット、場合によってはパリティビット、および1つ以上のストップビットで構成されます。ほとんどのアプリケーションでは、最下位データビット(この図の左側)が最初に送信されますが、例外もあります(IBM 2741印刷端末など)。
UARTハードウェアのすべての動作は、データレートの倍数(通常はビットレートの8倍または16倍)で動作する内部クロック信号によって制御されます。受信側は、各クロックパルスで受信信号の状態をテストし、スタートビットの開始を探します。見かけ上のスタートビットがビット時間の少なくとも半分以上続く場合、それは有効であり、新しい文字の開始を示します。そうでない場合は、偽パルスとみなされ、無視されます。さらにビット時間待機した後、ラインの状態が再びサンプリングされ、結果のレベルがシフトレジスタにクロックされます。文字長に必要なビット周期数(通常は5~8ビット)が経過すると、シフトレジスタの内容が(並列に)受信システムに提供されます。UARTは、新しいデータが利用可能であることを示すフラグを設定し、ホストプロセッサに受信データの転送を要求するプロセッサ割り込みを生成することもあります。
通信UARTは、通信信号以外に共有タイミングシステムを持ちません。通常、UARTは、スプリアスパルスとみなされないデータラインの変化ごとに内部クロックを再同期します。このようにしてタイミング情報を取得することで、送信機が本来の速度とわずかに異なる速度で送信している場合でも確実に受信できます。単純なUARTはこれを行いません。代わりに、スタートビットの立ち下がりエッジでのみ再同期し、各期待データビットの中央を読み取ります。このシステムは、ブロードキャストデータレートがストップビットを確実にサンプリングできるほど正確であれば機能します。[ 9 ] [ 10 ]
UARTでは、次の文字を受信しながら最新の文字を記憶しておくのが標準的な機能です。この「ダブルバッファリング」により、受信側のコンピュータは受信した文字を取得するために、文字全体の送信時間を確保できます。多くのUARTは、受信シフトレジスタとホストシステムインターフェースの間に、小型の先入れ先出し(FIFO)バッファメモリを備えています。これにより、ホストプロセッサはUARTからの割り込みを処理するための時間をさらに確保でき、高速データ転送時の受信データの損失を防ぐことができます。
送信動作は、タイミングをラインの状態から決定する必要がなく、固定のタイミング間隔にも縛られないため、よりシンプルです。送信システムがシフトレジスタに文字を格納すると(前の文字の処理が完了した後)、UART はスタート ビットを生成し、必要な数のデータ ビットをラインにシフトし、パリティ ビットを生成して送信し(使用する場合)、ストップ ビットを送信します。全二重動作では文字を同時に送受信する必要があるため、UART は送信文字と受信文字に 2 つの異なるシフトレジスタを使用します。高性能 UART には、CPUまたは DMA コントローラがシフトレジスタに 1 文字ずつ格納するのではなく、FIFO に複数の文字をバーストして格納できるように、送信 FIFO (先入れ先出し) バッファが含まれる場合があります。1 文字または複数の文字の送信には、CPU の速度に比べて時間がかかる場合があるため、UART はビジー状態を示すフラグを保持し、ホスト システムが送信バッファまたはシフトレジスタに少なくとも 1 文字があるかどうかを知ることができるようにします。 「次の文字を受け取る準備ができました」という合図は、割り込みによっても伝えられる場合があります。
正しく動作させるには、送信側と受信側のUARTを同じビット速度(ボーレート)、文字長、パリティ、ストップビット数に設定する必要があります。受信側のUARTは、設定の不一致を検出してホストシステムに「フレーミングエラー」フラグビットを設定する場合があります。例外的なケースでは、受信側のUARTは文字化けした不規則な文字列を生成し、ホストシステムに送信します。
モデムに接続されたパーソナルコンピュータで使用される一般的なシリアルポートは、1つのスタートビット、8つのデータビット、パリティなし、および1つのストップビットを使用します。この構成では、1秒あたりのASCII文字数は、ビットレートを10で割った値に等しくなります。
物理的なUARTを搭載していない一部の低価格ホームコンピュータや組み込みシステムでは、入力ポートの状態をサンプリングしたり、出力ポートを直接操作してデータ送信を行うことで、ソフトウェアによるプロトコルのエミュレーションが用いられることがある。CPUのタイミングが非常に重要となるため、処理負荷は高くなるものの、UARTチップを省略できるため、コストとスペースの節約につながる。この手法はビットバンギングと呼ばれている。
以下の表に記載されている部品のほとんどは製造中止となっており、現在は生産されていません。デュアルUART(DUART)は、2つのUARTを1つのチップに統合したものです。同様に、クワッドUART(QUART)は、NXP 28L194のように、4つのUARTを1つのパッケージに統合したものです。オクタルUART(OCTART)は、 Exar XR16L788やNXP SCC2698のように、8つのUARTを1つのパッケージに統合したものです。
マザーボードのスロットに接続するタイプのパーソナルコンピュータ用モデムの中には、カード上にUART機能を搭載しているものがあります。IBMパーソナルコンピュータに付属していたオリジナルの8250 UARTチップは、受信側と送信側それぞれに1文字分のバッファしか備えていなかったため、特にマルチタスクシステムで動作している場合やディスクコントローラからの割り込みを処理する場合、 9600ビット/秒を超える速度では通信ソフトウェアのパフォーマンスが低下しました。高速モデムでは、オリジナルのチップと互換性がありながら、FIFOバッファを追加したUARTが使用され、ソフトウェアが受信データに応答する時間を確保できるようになりました。
高ビットレートでのパフォーマンス要件を見ると、16、32、64、または128バイトのFIFOが必要な理由がわかります。DOSシステムのMicrosoft仕様では、割り込みを一度に1ミリ秒以上無効にしてはならないと規定されています。一部のハードディスクドライブやビデオコントローラはこの仕様に違反しています。9600ビット/秒では、約1ミリ秒ごとに1文字が配信されるため、最大割り込み無効時間を満たすDOSシステムでは、このレートで1バイトのFIFOで十分です。これを超えるレートでは、古い文字がフェッチされる前に新しい文字が受信される可能性があり、その結果、古い文字が失われます。これはオーバーランエラーと呼ばれ、1つ以上の文字が失われる結果となります。
16バイトのFIFOを使用すると、コンピュータが割り込みを処理する前に最大16文字を受信できます。これにより、割り込みデッドタイムが1ミリ秒の場合、コンピュータが確実に処理できる最大ビットレートが9600から153,000ビット/秒に増加します。32バイトのFIFOを使用すると、最大レートは300,000ビット/秒以上に増加します。FIFOを使用するもう1つの利点は、コンピュータが処理しなければならない割り込みの数が約8~12%に減るため、画面の更新やその他のタスクにCPU時間をより多く割り当てられることです。したがって、コンピュータの応答速度も向上します。
UARTの通信プロトコルはシンプルなので、最新のマイクロコントローラ(例えばArduino [ 18 ]やTeensy [ 19 ])のソフトウェアでGPIOピンをビットバンギングすることでエミュレートしたり、プログラマブルI/Oステートマシン(例えばRaspberry Pi PicoのPIO [ 20 ] [ 21 ]やNXPのFlexIO [ 22 ])でエミュレートしたりできます。