○簡易型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 );
				}  		
			}	
		}
	}
}