シリアル ポート制御ピンの使用
制御ピン
シリアル ポート信号とピン割り当てで説明されているように、9 ピン シリアル ポートには 6 つの制御ピンがあります。シリアル ポート制御ピンに関連付けられている関数とプロパティは、以下のとおりです。
関数 | 目的 |
---|---|
getpinstatus | シリアル ピンのステータスを取得する。 |
setRTS | RTS ピンの状態を指定する。 |
setDTR | DTR ピンの状態を指定する。 |
FlowControl | 使用するデータ フロー制御法を指定する。 |
接続されているデバイスの存在の通知
DTE と DCE は、CD、DSR、RI および DTR の各ピンを頻繁に使用してシリアル ポート デバイス間で接続が確立されたかどうかを示します。接続が確立されると、データの書き込みや読み取りを開始できます。
関数 getpinstatus
を使って CD ピン、DSR ピン、および RI ピンの状態を監視できます。関数 setDTR
を使って DTR ピンの状態を指定できます。
次の例は、2 つのモデムが互いに接続されている場合に、これらのピンがどのように使用されるかについて示しています。
2 つのモデムの接続
この例 (Windows® マシンで表示) では、同じコンピューターを通じて 2 つのモデムを相互に接続し、コンピューターとモデム間の接続、およびモデムとモデム間の接続の通信ステータスを監視する方法について説明します。最初のモデムは COM1 に接続され、2 番目のモデムは COM2 に接続されます。
機器への接続 — モデムの電源を入れた後、シリアル ポート オブジェクト
s1
が最初のモデム用に作成され、シリアル ポート オブジェクトs2
が 2 番目のモデム用に作成されます。どちらのモデムも 9600 ビット/秒のボー レートに設定されています。s1 = serialport("COM1",9600); s2 = serialport("COM2",9600);
関数
getpinstatus
を使用して Data Set Ready ピンの値を調べることで、モデム (データ セット) がコンピューターと通信する準備ができていることを確認できます。getpinstatus(s)
ans = struct with fields: ClearToSend: 1 DataSetReady: 1 CarrierDetect: 0 RingIndicator: 0
どちらのモデムもオブジェクトに接続される前に電源が入っていたため、
DataSetReady
フィールドの値は1
、すなわちtrue
です。プロパティの構成 — どちらのモデムも、関数
configureTerminator
を使用してキャリッジ リターン (CR) 終端文字用に構成されています。configureTerminator(s1,"CR") configureTerminator(s2,"CR")
データの書き込みと読み取り — 関数
writeline
を使用してatd
コマンドを最初のモデムに書き込みます。このコマンドはモデムを "受話器の外れた" 状態にし、これは、電話の受話器を手で取る動作に相当します。writeline(s1,'atd')
関数
writeline
を使用してata
コマンドを 2 番目のモデムに書き込みます。このコマンドは、モデムを "応答モード" にします。これによって、最初のモデムに接続されます。writeline(s2,'ata')
2 つのモデムが接続の取り決めを行った後は、関数
getpinstatus
を使用して Carrier Detect ピンの値を調べることで接続ステータスを確認できます。getpinstatus(s)
ans = struct with fields: ClearToSend: 1 DataSetReady: 1 CarrierDetect: 1 RingIndicator: 0
2 番目のモデムによって返される説明的なメッセージを読み取ることで、モデム同士の接続を確認することもできます。
s2.NumBytesAvailable
ans = 25
out = read(s2,25,"uint32")
out = ata CONNECT 2400/NONE
次に、関数
setDTR
を使用することで、2 つのモデム間の接続を切断します。関数getpinstatus
を使用して Carrier Detect ピンの値を調べることで、モデムが切断されていることを確認できます。setDTR(s1,false) getpinstatus(s1)
ans = struct with fields: ClearToSend: 1 DataSetReady: 1 CarrierDetect: 0 RingIndicator: 0
切断とクリーンアップ — 終了したら、MATLAB® ワークスペースからオブジェクトをクリアします。
clear s1 s2
データ フローの制御: ハンドシェーキング
データ フロー制御または "ハンドシェーキング" は、送信中のデータ損失を防ぐために DCE と DTE 間の通信に使用される方法です。たとえば、コンピューターが処理される前に限られた量のデータしか受信できないと仮定します。この制限に達すると、データの送信を中止するためにハンドシェーキング信号が DCE に送信されます。コンピューターがより多くのデータを受信できる場合は、他のハンドシェーキング信号が DCE に送信されてデータの送信を再開します。
デバイスがサポートしている場合は、次のいずれかの方法でデータ フローを制御できます。
メモ
デバイスをハードウェア ハンドシェーキングとソフトウェア ハンドシェーキング用に同時に構成することは可能ですが、MATLAB はこの動作はサポートしません。
FlowControl
プロパティを使ってデータ フロー制御法を指定できます。FlowControl
が hardware
である場合は、データ フローの制御にハードウェア ハンドシェーキングが使用されます。FlowControl
が software
である場合は、データ フローの制御にソフトウェア ハンドシェーキングが使用されます。FlowControl
が none
である場合、ハンドシェーキングは使用されません。
ハードウェア ハンドシェーキング
ハードウェア ハンドシェーキングは、特定のシリアル ポート ピンを使用してデータ フローを制御します。ほとんどの場合、これらは RTS ピンと CTS ピンです。これらのピンを使用したハードウェア ハンドシェーキングは、RTS ピンと CTS ピンで説明されています。
FlowControl
が hardware
である場合、RTS ピンと CTS ピンは DTE と DCE によって自動的に管理されます。関数 getpinstatus
を使って CTS ピンの値を返すことができます。関数 setRTS
を使って RTS ピンの値を構成することができます。
メモ
デバイスの中には、ハンドシェーキング用に DTR ピンと DSR ピンを使用するものがあります。ただし、これらのピンは通常、システムが通信準備を完了していることを示すために使用され、データ送信の制御には使用されません。MATLAB では、ハードウェア ハンドシェーキングは常に RTS ピンと CTS ピンを使用します。
デバイスが標準的な方法でハードウェア ハンドシェーキングを使用しない場合は、関数 setRTS
を使用して RTS ピンを手動で構成する必要があるかもしれません。この場合は、FlowControl
を none
に設定します。FlowControl
が hardware
である場合、指定する RTS 値は使用されない可能性があります。ピンの動作を指定するには、デバイスのドキュメンテーションを参照してください。
ソフトウェア ハンドシェーキング
ソフトウェア ハンドシェーキングは、特定の ASCII 文字を使用してデータ フローを制御します。以下の表では、Xon および Xoff (または XON および XOFF) と呼ばれるこれらの文字を説明しています。
ソフトウェア ハンドシェーキング文字
文字 | 整数値 | 説明 |
---|---|---|
Xon | 17 | データ送信を再開。 |
Xoff | 19 | データ送信を一時停止。 |
ソフトウェア ハンドシェーキングを使用する際、制御文字は通常のデータと同じ方法で送信ラインを通して送信されます。したがって、TD ピン、RD ピン、および GND ピンのみが必要となります。
ソフトウェア ハンドシェーキングの主な欠点は、数値データが機器に書き込まれているときに Xon 文字または Xoff 文字を書き込めないことです。これは、数値データに 17 または 19 が含まれることがあり、制御文字とデータを区別できないためです。ただし、データを機器から非同期的に読み取っているときは、TD ピンと RD ピンを両方使用しているため、Xon または Xoff を書き込むことができます。
ソフトウェア ハンドシェーキングの使用. ソフトウェア フロー制御をシリアル ポート アプリケーションと併用するとします。そのためには、ソフトウェア フロー制御用に機器とシリアル ポート オブジェクトを構成しなければなりません。Tektronix® TDS 210 オシロスコープに接続されたシリアル ポート オブジェクト s
の場合、この構成は次のコマンドによって行われます。
writeline(s,"RS232:SOFTF ON") s.FlowControl = "software";
データ転送を一時停止するには、数値 19
(Xoff) を機器に書き込みます。
write(s,19,"uint32");
データ転送を再開するには、数値 17
(Xon) を機器に書き込みます。
write(s,17,"uint32");