Last Updated 2002/02/06
Programming Tips Windows COMMポート  索 引 
DSR等の状態
2002/02/06

COMMポートのDSRとCTSの状態を取得する方法


Win32 : GetCommModemStatus()
Win16 : SetCommEventMask() & GetCommEventMask()

************
* サンプル *
************
<Win32>
    HANDLE  hdCOM       // CreateFileで返される通信デバイスハンドル
    DWORD   dwSts;

    BOOL    fSuccess = GetCommModemStatus( hdCOM, &dwSts );    // 信号ステータスの取得
    if( !fSuccess ){
    } else {
        if( dwSts & MS_DSR_ON ){
            // DSR信号ON
        }

        if( dwSts & MS_CTS_ON ){
            // CTS信号ON
        }
    }
               ・
               ・

<Win16>
    int    idCommDev;           // OpenComm結果格納エリア(デバイス識別値)
    BOOL   fCTSStatus = False;  // CTS信号ステータス
    BOOL   fDSRStatus = False;  // DSR信号ステータス

    // 監視するイベントのセット(CTSとDSR)
    SetCommEventMask( idCommDev, EV_CTS | EV_DSR );
    UINT   uSts;

    // CTS信号検査
    uSts = GetCommEventMask( idCommDev, EV_CTS );
    if( uSts & EV_CTS ){    // CTS信号変化あり
        if( fCTSStatus ){   // 前回CTSステータスがON
            fCTSStatus = FALSE;
        } else {
            fCTSStatus = TRUE;
        }
    } else {                // CTS信号変化なし
        if( fCTSStatus ){   // 前回CTSステータスがON
        } else {
        }
    }

    // DSR信号検査
    uSts = GetCommEventMask( idCommDev, EV_DSR );
    if( uSts & EV_CTS ){    // DSR信号変化あり
        if( fDSRStatus ){   // 前回DSRステータスがON
            fDSRStatus = FALSE;
        } else {
            fDSRStatus = TRUE;
        }
    } else {                // DSR信号変化なし
        if( fDSRStatus ){   // 前回DSRステータスがON
        } else {
        }
    }


Win16にて,最初にDSR信号,CTS信号がON状態であった時にそのステータスをうまく取得できない.

SetCommEventMask() & GetCommEventMask()では信号の変化しか検知できない.
GetCommModemStatus()から得られる信号ステータスに機種依存が存在する.

Win32APIのGetCommProperties()は,対象通信デバイスにDTR/DSR, RTS/CTSのサポートがあるかどうかを調べる.
このAPIでセットされる通信プロパティ(COMMPROP構造体)内にDTR/DSRおよびRTS/CTSサポート有無情報が存在する.(構造体内のdwProvCapabilities)

if( dwProvCapabilities & PCF_DTRDSR ){
   // DTR/DSRサポートあり
} else {
   // DTR/DSRサポートなし
}

if( dwProvCapabilities & PCF_RTSCTS ){
   // RTS/CTSサポートあり
} else {
   // RTS/CTSサポートなし
}


参照
前後のTips
DSR等の状態

DSS ProgrammingTipsCGI Ver2.01