

シリアルポートは、情報が1ビットずつ順次送受信されるシリアル通信インターフェースです。 [ 1 ]これは、複数のビットを同時に並列に通信するパラレルポートとは対照的です。パーソナルコンピュータの歴史のほとんどにおいて、データはシリアルポートを介してモデム、端末、各種周辺機器などのデバイスに転送され、コンピュータ間でも直接転送されてきました。
Ethernet、FireWire、USBなどのインターフェースもシリアルストリームとしてデータを送信するが、シリアルポートという用語は通常、 RS-232またはRS-485やRS-422などの関連規格に準拠したハードウェアを指す。
現代の一般消費者向けパーソナルコンピュータ(PC)では、シリアルポートは主にUSBなどの高速規格に置き換えられています。しかし、シリアルポートは、産業オートメーションシステム、科学機器、POSシステム、一部の産業用および民生用製品など、シンプルで低速なインターフェースを必要とするアプリケーションでは依然として頻繁に使用されています。
サーバーコンピュータは診断用の制御コンソールとしてシリアルポートを使用することがあり、一方、ルーターやスイッチなどのネットワーク機器は、設定、診断、緊急メンテナンスアクセスにシリアルコンソールポートを一般的に使用します。これらの機器やその他の機器と接続するために、USB-シリアル変換アダプタを使用すれば、最新のPCにシリアルポートを迅速かつ簡単に追加できます。
現代のデバイスは、シリアルポートを実装するためにUARTと呼ばれる集積回路を使用しています。このICは、文字を非同期シリアル形式に変換し、シリアルプロトコルで指定されたデータのタイミングとフレーミングをハードウェアで実装します。IBM PCは、シリアルポートが存在する場合、1つ以上のUARTを使用してシリアルポートを実装します。
初期の家庭用コンピュータなど、非常に低価格なシステムでは、代わりにCPUを使用してビットバンギング方式でデータを出力ピン経由で送信していました。これらの初期の家庭用コンピュータは、RS-232と互換性のないピン配置と電圧レベルの独自のシリアルポートを備えていることが多かったのです。
大規模集積回路(LSI)の登場によりUARTが普及する以前は、メインフレームやミニコンピュータではシリアルポートが一般的に使用されていました。これらのコンピュータには、シフトレジスタ、論理ゲート、カウンタ、その他必要なすべてのロジックを実装するための複数の小型集積回路が搭載されていました。PCの進化に伴い、シリアルポートはスーパーI/Oチップ、そしてチップセットに組み込まれるようになりました。
シリアルポート上の個々の信号は単方向であり、2つのデバイスを接続する場合、一方のデバイスの出力をもう一方のデバイスの入力に接続する必要があります。デバイスは、データ端末装置(DTE)とデータ回線終端装置(DCE)の2つのカテゴリに分類されます。DTEデバイスの出力となるラインはDCEデバイスでは入力となり、その逆も同様です。そのため、DCEデバイスは、片方の端の各ピンをもう一方の端の同じ番号のピンに接続するストレートケーブルを使用してDTEデバイスに接続できます。
従来、コンピュータや端末はDTE(直接端末機器)であり、モデムなどの周辺機器はDCE(直接通信機器)である。2台のDTE(またはDCE)機器を接続する必要がある場合は、TX(送信)線とRX(受信)線が逆になっているケーブル(クロスオーバーケーブル、ロールオーバーケーブル、またはヌルモデムケーブルと呼ばれる)を使用する必要がある。
一般的に、シリアルポートコネクタは性別が決まっており、反対の性別のコネクタとしか嵌合できません。D -subミニチュアコネクタの場合、オス型コネクタには突出したピンがあり、メス型コネクタには対応する丸いソケットがあります。[ 2 ]どちらのタイプのコネクタも、機器やパネルに取り付けたり、ケーブルを終端したりできます。
DTEに取り付けられているコネクタはオスである可能性が高く、DCEに取り付けられているコネクタはメスである可能性が高い(ケーブルコネクタは逆)。ただし、これは普遍的なものではない。たとえば、ほとんどのシリアルプリンタはメスのDB25コネクタを備えているが、それらはDTEである。[ 3 ]このような状況では、ケーブル上の適切な性別のコネクタまたはジェンダーチェンジャーを使用して不一致を修正することができる。
オリジナルのRS-232規格で規定されていたコネクタは25ピンのD-subミニチュアコネクタのみでしたが、コスト削減や省スペース化などの理由から、他にも多くのコネクタが使用されてきました。特に、多くの機器は規格で定義されている20種類の信号すべてを使用しないため、ピン数の少ないコネクタがよく用いられます。以下に具体的な例を挙げますが、RS-232接続には他にも無数のコネクタが使用されています。
9ピンDE-9コネクタは、 PC-ATのシリアル/パラレルアダプタオプション以来、ほとんどのIBM互換PCで使用されており、9ピンコネクタによりシリアルポートとパラレルポートを同じカードに搭載することが可能になった。[ 4 ]このコネクタは、 TIA-574としてRS-232用に標準化されている。
小型電子機器、特にグラフ電卓[ 5 ]や携帯型アマチュア無線機および双方向無線機[ 6 ]には、電話コネクタを使用したシリアルポートがあり、通常は小型の2.5mmまたは3.5mm コネクタと、送信、受信、接地という最も基本的な3線式インターフェースが使用されています。
8P8Cコネクタは多くのデバイスでも使用されています。EIA /TIA-561規格ではこのコネクタを使用したピン配置が定義されており、ロールオーバーケーブル(またはYost規格)はUnixコンピュータやCisco Systemsの機器などのネットワークデバイスで一般的に使用されています。[ 7 ]
Macintoshの多くのモデルは、関連するRS-422規格を採用しており、主に円形のミニDINコネクタを使用しています。Macintoshには、プリンタとモデムを接続するための標準の2つのポートが搭載されていましたが、一部のPowerBookラップトップには、スペースを節約するために1つの複合ポートしかありませんでした。[ 8 ]
10P10Cコネクタは一部のデバイスに見られます。[ 9 ]
もう1つの一般的なコネクタは、マザーボードや拡張カードによく見られる10×2ピンヘッダーで、通常はリボンケーブルを介してより標準的な9ピンDE-9コネクタに変換され(多くの場合、空きスロットプレートまたはハウジングの他の部分に取り付けられます)。[ 10 ]
オペレーティングシステムは通常、プログラムがハードウェアアドレスでシリアルポートを参照することを要求するのではなく、コンピュータのシリアルポートにシンボル名を割り当てます。
Unix系オペレーティングシステムでは、通常、シリアルポートデバイスは/dev/tty*というラベルで表されます。TTYは、初期のコンピュータのシリアルポートによく接続されていたデバイスであるテレタイプの一般的な略語(商標権は使用されていません)であり、*は特定のポートを識別する文字列を表します。この文字列の構文は、オペレーティングシステムとデバイスによって異なります。
Linuxでは、一般的な通信を目的としたシリアル ポートの名前は、/dev/ttyで始まり、大文字で構成されるタイプ プレフィックスが続き、0から始まるシーケンス番号で終わります。たとえば、8250 / 16550 UARTシリアル ポートは/dev/ttyS* ( /dev/ttyS0、/dev/ttyS1など) という名前になります。USB アダプタは/dev/ttyUSB*、/dev/ttyACM*、/dev/ttyHS*という名前になります。その他のタイプには、さらに別のプレフィックスが付けられます。一般的な通信を目的としない仮想シリアル ポートの中には、意図的にこのパターンに一致しない名前を持つものもあります。
DOSおよびWindows環境では、シリアルポートはCOMポートと呼ばれ、COMに1から始まるシーケンス番号が続く名前が付けられます:COM1、COM2、...など[ 15 ] 。
このリストには、PCのシリアルポートに接続される一般的なデバイスがいくつか含まれています。モデムやシリアルマウスなど、使われなくなってきているものもあれば、今でも広く使われているものもあります。シリアルポートはほとんどのマイクロコントローラに搭載されており、PCや他のシリアルデバイスとの通信に利用できます。
シリアルポートの制御信号は任意のデジタル信号で駆動できるため、一部のアプリケーションでは、シリアルデータの交換を行わずに、シリアルポートの制御線を使用して外部デバイスを監視していました。この原理の一般的な商用アプリケーションとしては、無停電電源装置(UPS)の一部モデルがあり、制御線を使用して停電、バッテリー残量低下、その他のステータス情報を通知していました。少なくとも一部のモールス符号トレーニングソフトウェアでは、シリアルポートに接続されたコードキーを使用して実際のコードの使用をシミュレートしていました。シリアルポートのステータスビットは非常に高速かつ予測可能なタイミングでサンプリングできるため、ソフトウェアがモールス符号を解読することが可能でした。
シリアルコンピュータマウスや低電力データコンバータ(RS-232-422コンバータなど)は、受信したデータや制御信号から動作電力を得る場合があります。[ 16 ] [ 17 ]このモードは「自己給電」とも呼ばれます。
シリアル通信規格では、さまざまな動作速度に対応できるだけでなく、動作条件の違いに応じてプロトコルを調整することも可能です。最もよく知られているオプションとしては、速度、文字あたりのデータビット数、パリティ、文字あたりのストップビット数などがあります。
UART集積回路を使用する最新のシリアルポートでは、これらの設定はすべてソフトウェアで制御できます。1980年代以前のハードウェアでは、回路基板上のスイッチやジャンパーを設定する必要がある場合があります。
PCに接続するように設計されたシリアルポートの構成は、事実上の標準となっており、通常は9600/8-N-1と表記される。
シリアルポートは2レベル(バイナリ)信号方式を使用するため、データレート(ビット/秒)はシンボルレート(ボー)と等しくなります。全体の速度にはフレーミング用ビット(ストップビット、パリティなど)が含まれるため、実効データレートはビット伝送速度よりも低くなります。例えば、8-N-1文字フレーミングの場合、データに使用できるビットは全体の80%のみです。8ビットのデータごとに、さらに2ビットのフレーミングビットが送信されます。
標準的な一連のレートは、電気機械式テレプリンタのレートの倍数に基づいています。一部のシリアルポートでは、多くの任意のレートを選択できますが、データを正しく受信するには、接続の両側の速度が一致している必要があります。一般的にサポートされているビットレートには、75、110、300、1200、2400、4800、9600、19,200、38,400、57,600、115,200ビット/秒があります。[ 19 ]これらの標準モデムビットレートの多くは、1.2 kbit/s (例: 19200、38400、76800) または0.9 kbit/s (例: 57600、115200) のいずれかの倍数です。[ 22 ] 周波数 1.843200 MHz の水晶発振器は 、この目的のために特別に販売されています。これは最速のビットレートの16倍であり、シリアルポート回路は必要に応じてこれを容易に低周波数に分割することができる。
ビットレートを設定できるからといって、必ずしも接続が確立されるとは限りません。すべてのシリアルポートですべてのビットレートが使用できるわけではありません。楽器制御用のMIDIなど、一部の特殊用途プロトコルでは、テレプリンタ規格とは異なるシリアルデータレートが使用されます。シリアルポートの実装によっては、接続されたデバイスが送信しているデータを監視して同期することで、ビットレートを自動的に選択できるものもあります。
各文字のデータビット数は、5ビット(ボードコードの場合)、6ビット(まれに使用)、7ビット(真のASCIIの場合)、8ビット(ほとんどの種類のデータの場合。このサイズは1バイトのサイズと一致するため)、または9ビット(まれに使用)のいずれかになります。8ビットは、新しいアプリケーションではほぼ普遍的に使用されています。5ビットまたは7ビットは、テレプリンターなどの古い機器でのみ意味を持ちます。
ほとんどのシリアル通信設計では、各バイト内のデータビットは最下位ビットから順に送信されます。最上位ビットから送信することも可能ですが、これはまれにしか使用されません。例えば、IBM 2741印刷端末ではこの方式が採用されていました。ビットの順序は通常、シリアルポートインターフェース内で設定することはできず、ホストシステムによって定義されます。ローカルのデフォルトとは異なるビット順序を必要とするシステムと通信するには、ローカルソフトウェアが送信直前と受信直後に各バイト内のビットの順序を変更できます。
パリティは、伝送エラーを検出する方法です。シリアルポートでパリティを使用する場合、各データ文字に余分なデータビットが付加され、パリティビットを含めた各文字の1ビットの数が常に奇数または常に偶数になるように配置されます。1ビットの数が間違っているバイトが受信された場合、そのバイトは破損しているはずです。パリティが正しいからといって、必ずしも破損がないとは限りません。偶数個のエラーを含む破損した伝送はパリティチェックを通過してしまうからです。単一のパリティビットでは、各文字のエラー訂正を実装することはできません。シリアルデータリンク上で動作する通信プロトコルでは、通常、データの有効性を確保し、誤って受信されたデータの再送信を要求するための上位レベルのメカニズムが備えられています。
各文字のパリティビットは、以下のいずれかに設定できます。
最後のビット(通常は9ビット目)を何らかのアドレス指定や特殊な信号伝達に使用するような特殊な用途を除けば、マークパリティやスペースパリティは、エラー検出情報を追加しないため、一般的ではありません。
奇数パリティは偶数パリティよりも有用です。なぜなら、奇数パリティでは各文字で少なくとも1回の状態遷移が発生することが保証されるため、シリアルポートの速度不一致などによって発生する可能性のあるエラーをより確実に検出できるからです。ただし、最も一般的なパリティ設定は「なし」であり、エラー検出は通信プロトコルによって処理されます。
回線ノイズによって破損したメッセージを検出できるようにするため、電気機械式テレプリンタは、受信データにパリティエラーが含まれている場合に特殊文字を印刷するように構成されていた。
各文字の末尾にストップビットを送信することで、受信信号ハードウェアは文字の終わりを検出し、文字ストリームとの同期を回復できます。電子機器では通常1ストップビットを使用しますが、低速な電気機械式テレプリンタを使用する場合は、1.5ストップビットまたは2ストップビットが必要になる場合があります。

データ/パリティ/ストップ (D/P/S) の慣用表記法は、シリアル接続のフレーミングを指定します。パーソナル コンピューティング デバイスで最も一般的な構成は8-N-1 (8N1、8-None-1 [ 23 ]とも表記) で、1 つのスタート ビット、8 つの ("8") データ ビット、0 つの ("N") パリティ ビット、および 1 つの ("1") ストップ ビットがあります。[ 24 ] この表記法では、パリティ ビットはデータ ビットの数には含まれません。たとえば、7/E/1 (7E1) は、7 つのデータ ビットに偶数パリティ ビットが追加され、スタート ビットとストップ ビットの間に合計 8 ビットがあることを意味します。
略語は通常、「9600–8-N-1」のように、ビット/秒単位の回線速度とともに示されます。速度(またはボーレート)にはフレーミング用のビット(ストップビット、パリティなど)が含まれるため、実効データレートはボーレートよりも低くなります。8-N-1 エンコーディングでは、データに使用できるビットは 80% のみです(8 ビットのデータごとに、1 ビットのスタート、8 ビットのデータ、および 1 ビットのストップ ビットの 10 ビットがシリアル リンクを介して送信されます)。[ 23 ]
フロー制御は、送信側が受信側よりも速くデータを送信できる可能性がある状況で使用されます。これに対処するため、シリアル回線ではハンドシェイク方式がよく用いられます。ハンドシェイク方式には、ハードウェア方式とソフトウェア方式があります。
ハードウェアハンドシェイクは、RS-232 RTS/CTSまたはDTR/DSR信号回路などの追加信号を使用して行われます。RTSとCTSはデータフローの制御に使用され、例えばバッファがほぼ満杯になったことを知らせます。RS-232規格とその後継規格では、DTRとDSRは機器が存在し電源が入っていることを示す信号として使用されるため、通常は常にアサートされています。ただし、DTRをフロー制御として使用するプリンタなど、非標準的な実装も存在します。
ソフトウェアハンドシェイクは、例えばASCII制御文字XON/XOFFを用いてデータフローを制御することで行われます。受信側から送信側へXONとXOFF文字が送信され、送信側がデータを送信するタイミングを制御します。つまり、これらの文字は送信されるデータとは逆方向に送られます。システムは送信許可状態から始まります。受信側のバッファが容量に近づくと、受信側はXOFF文字を送信して送信側にデータの送信を停止するよう指示します。その後、受信側がバッファを空にした後、XON文字を送信して送信側に送信を再開するよう指示します。これは、制御情報がデータと同じチャネルで送信されるインバンドシグナリングの一例です。
ハードウェアハンドシェイクの利点は、非常に高速であること、転送データにASCIIなどの意味付けを施さなくても動作すること、そしてステートレスであることです。欠点は、より多くのハードウェアとケーブルが必要となること、そして接続の両端が使用するハードウェアハンドシェイクプロトコルをサポートしている必要があることです。
ソフトウェアハンドシェイクの利点は、ハードウェアハンドシェイク回路やケーブルが存在しない、あるいは互換性がない場合でも実行できることです。一方、すべてのインバンド制御信号に共通する欠点は、データメッセージがブロックされた場合でも制御メッセージが確実に通過し、データが制御信号と誤認されないようにするための複雑さが生じることです。前者は通常、オペレーティングシステムまたはデバイスドライバによって処理されます。後者は通常、制御コードをエスケープする( Kermitプロトコルなど)か、設計上省略する( ANSI端末制御など)ことによって処理されます。
ハンドシェイクを使用しない場合、オーバーランした受信側は送信側からデータを受信できない可能性があります。これを防ぐための方法としては、受信側が常に追いつけるように接続速度を落とす、平均してより長い時間追いつけるようにバッファサイズを大きくする、時間のかかる処理の後に遅延を設ける( termcapなど)、正しく受信されなかったデータを再送信するメカニズムを採用する(TCPなど)などが挙げられます。