○簡易型Windowsからの外部制御
WindowsではCOMポートの制御線を個別に制御することが可能です。この制御はUSB経由の COMポートでも可能です。前述のスイッチ入力をWindowsからのCOMポートの制御に置き換えると以下のようなプログラムになります。
注:回路を簡略にするためDTR出力をHighレベルにすることによって得られる電圧を使ってCD入力のHighレベルを供給します。// list0910_com1.cpp シリアルポートのコントロールラインの制御 // #include<stdio.h> #include <Windows.h> main() { HANDLE h; h = CreateFile( "COM5", 0, 0, // 非共有 0, // セキュリティ属性,使用しない OPEN_EXISTING, // 既存ファイルのオープン 0, 0 ); // 属性,テンプレート if( h == INVALID_HANDLE_VALUE ){ h = CreateFile( "COM3", 0, // COM5がだめならCOM3を開ける 0, 0, OPEN_EXISTING, // 既存ファイルのオープン 0, 0 ); // 属性,テンプレート if( h == INVALID_HANDLE_VALUE ){ printf( "Open err" ); return 0; } } EscapeCommFunction( h, SETDTR ); while(1){ DWORD x00 ; GetCommModemStatus( h, &x00 ); if( x00 & MS_RLSD_ON ) { printf("CD_ON \n" ); EscapeCommFunction( h, SETRTS ); } else { printf("CD_OFF \n" ); EscapeCommFunction( h, CLRRTS ); } } } // list0910_com2.cpp シリアルポートのコントロールラインの制御 // #include<stdio.h> #include <Windows.h> main() { HANDLE h; h = CreateFile( "COM5", 0, 0, // 非共有 0, // セキュリティ属性,使用しない OPEN_EXISTING, // 既存ファイルのオープン 0, 0 ); // 属性,テンプレート if( h == INVALID_HANDLE_VALUE ){ h = CreateFile( "COM3", 0, // COM5がだめならCOM3を開ける 0, 0, OPEN_EXISTING, // 既存ファイルのオープン 0, 0 ); // 属性,テンプレート if( h == INVALID_HANDLE_VALUE ){ printf( "Open err" ); return 0; } } EscapeCommFunction( h, SETDTR ); int a,b,sw = 0; DWORD x00 ; GetCommModemStatus( h, &x00 ); b = x00 & MS_RLSD_ON ; while(1){ GetCommModemStatus( h, &x00 ); a = x00 & MS_RLSD_ON ; if(a != b){ //変化があった b = a; if(a){ //プラスのエッジ if(sw){ sw = 0; printf("CD_OFF \n" ); EscapeCommFunction( h, CLRRTS ); } else { sw = 1; printf("CD_ON \n" ); EscapeCommFunction( h, SETRTS ); } } } } }