高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先



*NW 44 - OpenTransport によりシリアル・ポートの I/O ハンドシェイク

(96 年 11 月 27 日)

Q: OpenTransport によりシリアル・ポートの I/O ハンドシェイクは、どのように指定し、どのように制御すればいいのですか?オプションの設定がよくわかりません。

A: OpenTransport ネイティブ・インタフェースが提供する SRL_OPT_HANDSHAKE オプションを使うと、さまざまな方法でシリアル・ポートのハンドシェイクをカスタマイズできます。たとえば、入力ハンドシェイクが CTS 回線または XON/OFF シーケンスによって制御されるようにリクエストすることができます。ハンドシェイクの動作は、SRL_OPT_HANDSHAKE オプションを使って渡される 4 バイトの符号なし整数値を使って指定します。

+=====-========-========-========-========-========-========-========-========+
|ビット|   7    |   6    |   5    |   4    |   3    |   2    |   1    |   0    |
|バイト|        |        |        |        |        |        |        |        |
|======+========+========+=====================================================|
|  0   |        |        |        |        |        |        |        |        |
|------+-----------------------------------------------------------------------|
|  1   |        |        |        |        |  DTR   |  CTS   |XON/OFF |XON/OFF |
|      |        |        |        |        |  出力  |  入力  |  入力  |  出力  |
|------+-----------------------------------------------------------------------|
|  2   |                         XON 文字                                      |
|------+-----------------------------------------------------------------------|
|  3   |                         XOff 文字                                     |
+==============================================================================+

整数の上位ワード (16 ビット) は、1 つまたは複数の、次のようなビット・セットを含むビットマップです。


        kOTSerialXOnOffInputHandshake   = 1
        kOTSerialXOnOffOutputHandshake  = 2
        kOTSerialCTSInputHandshake      = 4
        kOTSerialDTROutputHandshake     = 8

最下位から 2 つ目のバイトは XOn 文字の値で、最下位バイトは XOff 文字の値です。

これらの値が 0 で、XOnOff ハンドシェイクがリクエストされているときは、XOff には ^S、XOn には ^Q というデフォルト値が使われます。

OpenTptSerial.h で定義されている、SerialHandshakeData(type, onChar, offChar) というインライン関数 (C ユーザの場合は #define) があり、この 4 バイトの値を作成するために使うことができます。このオプションのデフォルト値はハンドシェイクなしです。

たとえば、XON/XOFF 入力ハンドシェイクを有効にし、XON 文字として、^Q の代わりに ^T を使うように指定するときは、次のようなオプション構造体を作成します。

    TOption     opt;

    opt.len     = kOTFourByteOptionSize;
    opt.level   = XTI_GENERIC;

    opt.name    = SERIAL_OPT_HANDSHAKE;
    opt.value   = OTSerialHandshakeData (kOTSerialXOnOffInputHandshake,
                                         ('T' & ~0x40),
                                      // 通常は kOTSerialDefaultOnChar
                                         kOTSerialDefaultOffChar);

I_SetSerialXOffState Ioctl コマンドを使って、シリアル入力ポートの XOFF ステータスを制御することもできます。0 を指定すると、XOFF ステータスは無条件にクリアされ、1 を指定すると、XOFF ステータスは無条件に設定されます。

    OTIoctl(theSerialEndpoint, I_SetSerialXOffState, 1);    // XOFF のステータスを ON に設定

I_SetSerialXOn Ioctl を使うと、シリアル・ポートは XON 文字を送信するようになります。0 を指定すると、XOFF ステータスが設定されているときだけ、XON 文字が送信され、1 を指定すると、無条件に文字が送信されます。

    OTIoctl(theSerialEndpoint, I_SetSerialXOn, 1);          // 無条件に XON を送信

逆に、I_SetSerialXOff Ioctl を使うと、シリアル・ポートは XOFF 文字を送信するようになります。0 を指定すると、XON ステータスが設定されているときだけ、XOFF 文字が送信され、1 を指定すると、無条件に文字が送信されます。

    OTIoctl(theSerialEndpoint, I_SetSerialXOff, 1);         // 無条件に XOFF を送信

--Vinnie Moscaritolo
devsupport@apple.com


[ Technical Q&A's : Communications & Collaboration : Networking : NW44 ]