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サポートなし
}
参照