シリアル通信のフロー制御の秘密

Moxa テクニカル・ノート
シリアル通信のフロー制御の秘密
シニア・プロダクト・マネージャ、キャスパー・ヤン(Casper Yang)
[email protected]
RS-232/422/485 シリアル通信はもう「高速」であるとみなされてはい
ませんが、フロー制御は多くのアプリケーションにとってまだ重要な
機能です。フロー制御が何かはよく知られていますが、その仕組みや
それが通信システムの動作に与える影響についてはあまりよく知られ
ていません。本書では、フロー制御について詳しく説明し、通信にお
ける特定の問題を解決するのに必要なノウハウを提供します。
高/低水位
データ送信時にデータを保存するのにバッファが使用されると、デー
タのオーバーランを防ぐためにある種のフロー制御が必要になりま
す。フロー制御は UART FIFO、ドライバ、OS のカーネルなどで使用さ
れます。フロー制御を実行するには、受信バッファ高水位(RBH)と受
信バッファ低水位(RBL)の両方を設定する必要があります。RBH は受
信バッファに空きがなくなる前にデータの送信を停止するよう送信側
に知らせることで受信バッファのオーバーランを防ぎます。例えば、
受信バッファが 4 KB のデータを保存できる場合、データの送信は送信
側が停止命令を受信するまで続くので、RBH 値を 3 KB に設定したいと
思うかもしれません。というのも、データの着信は「ストップ」と言
った後でも少し続くからです。一方、RBL はデータ送信をいつ再開する
かを定義します。確信がない場合は、RBL をゼロに設定してください。
そうすると、バッファが完全に空になってから、確実に送信を再開す
るようにできます。ただし、RBL をゼロに設定すると、遅延が発生して
時間を無駄にすることがあるので、あまり効率的ではありません。
Released on December 30, 2009
Copyright © 2009 Moxa Inc. All rights reserved.
Moxa では広範な産業オートメーション用ネットワーク製品を製造しています。組込みコンピュータ、イーサネット・スイッチ、
無線ソリューション、シリアル・デバイス・サーバ、マルチポート・シリアル・カード、メディア・コンバータ、USB-シリア
ル・コンバータ、組込みデバイス・サーバ、ビデオ・ネットワーキング製品、産業用 I/O ソリューションを含むすべての Moxa
製品に関する情報は、www.moxa.com の Moxa 企業サイトに掲載されています。
お問い合わせ方法
Tel:+886-2-89191230 内線 399
Fax:+886-2-89191231
Web: japan.moxa.com
Email:[email protected]
本書は Moxa のテクニカル・ライティング・センター(TWC)によって
作成されました。本書または他の Moxa 文書に関するご意見やご提案
があれば、[email protected] までお送りください。
Moxa テクニカル・ノート
シリアル通信のフロー制御の秘密
データ
RBH
RBH
送信停止! データ量が RBH を超えました。RTS をオフに
するか、XOFF を送信してください。
図 1: 受信バッファのRBH値がデータ送信を制御する仕組み
データ
RBL
RBL
開始! データ量が RBL を下回りました。
RTS をオンにするか、XON を送信してください。
図 2: 受信バッファのRBL値がデータ送信を制御する仕組み
Copyright © 2009 Moxa Inc.
Page 2 of 6
Moxa テクニカル・ノート
シリアル通信のフロー制御の秘密
RTS/CTS と XON/XOFF のフロー制御の比較
シリアル通信では、ハードウェア・フロー制御とソフトウェア・フロ
ー制御の 2 種類のフロー制御があります。ハードウェア・フロー制御
は RTS/CTS(または DTR/DSR)信号を使って通信します。シリアル・デ
バイスとコンピュータを接続する場合は、CTS ピンと RTS ピンを接続し
てください。
(DTR/DSR フロー制御では、DSR と DTR を接続します。)送
信側は送信の前に CTS ピンの状態を確認して、
「CTS がオン」の場合は
送信を開始し、「CTS がオフ」の場合は送信を控えます(または送信を
停止します)
。一方、受信側は RTS を使って「開始」または「停止」を
知らせます。RTS がオフからオンになると、受信バッファのデータ量が
RBL を下回ったことを示し、RTS がオンからオフになると、データ量が
RBH を超えたことを意味します。
RTS
RTS
CTS
CTS
図3: RTS/CTSフロー制御の配線方法
ソフトウェア・フロー制御は送信信号と受信信号を使って、XOFF と XON
の制御文字を送信します。受信側は送信回線から XOFF 文字を送信(RTS
のオン-オフ変位に相当)して、送信の停止を送信側に知らせます。
また、送信回線から XON 文字を送信(RTS のオン-オフ変位に相当)し
て、送信の再開を送信側に知らせます。ほとんどのシリアル・デバイ
スは XON に 0x11、XOFF に 0x13 をデフォルトで使用していますが、値
は通常変更可能です。データにバイナリ実行ファイルを真にすること
がある XON/XOFF のいずれかの文字が含まれる場合は、他の文字を使用
してください。
シリアル通信は少なくとも送信、受信、グラウンド・ピンを接続する
必要がありますが、ハードウェア・フロー制御を使用する場合は RTS
ピンと CTS ピンも接続しなければなりません。これにより、配線費用
は増えますが、ハードウェア・フロー制御は信頼性に優れています。
費用が問題となる場合、データと XON/XOFF 文字が衝突しない限り、ソ
フトウェア・フロー制御を使用できます。シリアル・ドライバはデー
タの各バイトと XON/XOFF 文字を 1 つずつ確認する必要があることにも
注意してください。ソフトウェア・フロー制御に関連した問題のため、
多くの高機能な UART はオンチップ・ソフトウェア・フロー制御に対応
しています。
Copyright © 2009 Moxa Inc.
Page 3 of 6
Moxa テクニカル・ノート
シリアル通信のフロー制御の秘密
RS-422/485 の注意事項
RS-422/485 は差動信号パスを使用して、送信距離を延長できますが、
RS-232 とは異なる配線が必要です。そのため、ほとんどの RS-422/485
接続は送信信号と受信信号に対応するだけで、RTS/CTS 信号や DTR/DSR
信号には対応しません。したがって、XON/XOFF フロー制御を使用する
必要があります。ただし、2 線 RS-485 データ通信は半二重通信を使用
するので、状況が多少異なることに注意してください。データを 1 度
に送信できるのは 1 方向のみなので、フロー制御は必要ありません。4
線 RS-422/485 通信で RTS/CTS フロー制御を使用する場合、ホストとシ
リアル・デバイスの両方が同機能に対応していなければなりません。
実際、
(PCI ボードや PCI デバイスを含む)ほとんどのシリアル・ソリ
ューションは 4 線 RS-422/485 を使用しても RTS/CTS ピンには対応して
いません。
待ち時間の長い XON/XOFF
オンチップ・フロー制御について語る前に、ドライバがフロー制御機
能を実行する仕組みについて見てみましょう。ハードウェア・フロー
制御は CTS 信号と RTS 信号を使用します。ドライバは送信の前に CTS
ピンの信号を確認して、受信可能時に RTS 信号をオンに設定します。
RTS 信号の調整と CTS 状態の読み取りは非常に容易で迅速にできるの
で、費用を問題としない場合、ハードウェア・フロー制御を使うと高
い信頼性を確保できます。
ソフトウェア・フロー制御では、ドライバはデータの各着信バイトを
チェックして、XON 文字や XOFF 文字が受信されていないかどうか確認
する必要があります。ドライバは XOFF 文字の受信の前に、UART からの
データも読み取る必要があるので、ソフトウェア・フロー制御は時間
がかかるだけでなく、信頼性も高くありません。この待ち時間でドラ
イバは大量のデータを送信するので、受信側のデータのオーバーラン
の原因となります。
データ
データ
XOFF
データ
データ
図 4: XOFF 文字の受信には時間が必要
Copyright © 2009 Moxa Inc.
Page 4 of 6
Moxa テクニカル・ノート
シリアル通信のフロー制御の秘密
送信をただちに停止できるオンチップ・フロー制御
多くの高機能 UART はオンチップ・フロー制御を使用して、フロー制御
技術につきものの複雑性を回避しています。
「オンチップ」とは、UART
が RTS/CTS 信号と XON/XOFF 文字を自動的に処理することを意味しま
す。UART は UART FIFO のオーバーランを避けるため、内蔵の RBH と RBL
を使用します。RBH に達すると、UART は RTS を直ちにドロップするか、
XOFF 文字を送信します。たま、CTS が低下するか、XOFF 文字を受信す
ると、送信を直ちに停止します。低速デバイスでは、この機能は非常
に役立ちます。通常、低速デバイスのバッファは小さいので、XOFF 文
字の受信時、すぐに送信を停止させる必要があるからです。
UART がオンチップ・フロー制御に対応していても、設計に問題のある
ドライバの使用はデータ損失の原因となります。これは、UART に大量
のデータを保存できる容量があっても、ドライバがそれに対応できな
いからです。ドライバがバッファのオーバーランを防ぐ方法を理解し、
UART のオンチップ・フロー制御に対応するようにドライバを設計する
ことは非常に重要で、ドライバ開発に従事する業者の経験に多く依存
しています。
フロー制御を使用するには、ソフトウェアとハードウェアの両方の設
定を確認する必要があります。Windows と UNIX/Linux はソフトウェア
・フロー制御の標準インタフェースを備えています。詳しくは、
Win32/UNIX/Linux のプログラミング・ガイドを確認してください。ハ
ードウェア・フロー制御では、RTS/CTS ピンまたは DTR/DSR ピンを正し
く接続する必要があります。フロー制御を使用する必要がない場合は、
設定を必ずオフにしてください。RTS/CTS ケーブルを接続せずにフロー
制御を使用すると、CTS 状態が低いので、データは送信できません。
オンチップ・フロー制御を使用しない UART のソリューション
オンチップ・フロー制御はデータ損失やバッファのオーバーランを絶
対許さないアプリケーションにとって極めて重要です。使用している
シリアル・デバイスがオンチップ・ハードウェアまたはオンチップ・
ソフトウェア・フロー制御に対応しているかどうかはベンダーに確認
してください。対応していない場合、デバイスの FIFO を無効にすると、
信頼性を向上できます。これは、割り込み発生時にドライバが送信す
るバイト数を 1 バイトに限ることで、受信側にデータ処理のための時
間を多く与えられるようになるからです。XON/XOFF フロー制御では、
FIFO を無効にすると、待ち時間が改善されるので、XOFF 文字を処理し、
Copyright © 2009 Moxa Inc.
Page 5 of 6
Moxa テクニカル・ノート
シリアル通信のフロー制御の秘密
オーバーランを防ぐための十分な時間が確保されます。
結論
多くの高機能 UART は送信/受信 FIFO の高/低水位設定によるオンチッ
プ・フロー制御に対応しています。オーバランを防ぎ、良好なスルー
プットを得るため、オンチップ・フロー制御に対応した UART を選択し
て、高/低水位を正しく設定してください。通常、高水位はバッファ量
全体の 3/4 に、低水位はバッファ量全体の 1/4 に設定できます。今度、
オーバーランやデータ損失が生じた場合は、フロー制御設定を最初に
確認してください。
質問
回答
1 フロー制御を有効にしても、オー z 接続の両側を確認して、フロー制御を正しく設定
バーランやデータ損失が発生した
してください。
場合、どうしたらよいでしょうか。 z RTS/CTS フロー制御を使用している場合は、RTS
が CTS に(および CTS が RTS に)正しく接続され
ているかどうかを確認してください。
z オンチップ対応ではない XON/XOFF フロー制御を
使用している場合は、FIFO を無効にしてみてくだ
さい。
z 接続の両側でオンチップ・フロー制御に対応した
UART を使用し、使用しているドライバがこの機能
に対応しているかどうか確認してください。
z 接続の両側でオンチップ・フロー制御に対応した
UART を使用している場合、ドライバが問題の原因
であると考えられます。
2 使用している UART がオンチップ・ ほとんどのマザーボードには UART が 1 基または 2 基
フロー制御に対応しているかどう 備えられていますが、それらは 16550A で、オンチッ
かを確認する方法を教えてくださ プ・フロー制御には対応していません。Moxa の MU860
や 16950 といった一部の高機能 UART は RTS/CTS と
い。
XON/XOFF の両方のフロー制御に対応していますが、
16550C などの通常の UART が対応しているのは
RTS/CTS だけです。詳しくは製品のデータシートを参
照するか、製造業者にお問い合わせください。
Copyright © 2009 Moxa Inc.
Page 6 of 6