// Copyright 2005 Doi Shigeki // list0702.cpp ダイアログ・ボックス版通信プログラム // 入力はタイマでトリガ // list309.h、list309.rcを一緒にビルドすること #include #include "list309.h" BOOL CALLBACK dlgproc( HWND, UINT, WPARAM, LPARAM ); HANDLE h; // ダイアログ・プロシージャでも使うので // グローバル変数にする int WINAPI WinMain( HINSTANCE hi, HINSTANCE, LPSTR, int ) { h = CreateFile( "COM4", GENERIC_READ | GENERIC_WRITE, 0, // 非共有 0, // セキュリティ属性,使用しない OPEN_EXISTING, // 既存ファイルのオープン 0, 0 ); // 属性,テンプレート if( h == INVALID_HANDLE_VALUE ) { MessageBox( NULL, "COMポートがオープンできません","err", MB_OK); return 0; } DCB dcb; // 通信仕様の設定 GetCommState( h , &dcb ); // 現在の設定をベースにして設定 dcb.ByteSize = 8; // 8ビット dcb.BaudRate = 9600; // 9600ボー dcb.fOutxCtsFlow = 0; // CTSを送信可に使わない(0)/使う(1) if( ! SetCommState( h , &dcb )){ MessageBox( NULL, "DCBのエラー","err", MB_OK); return 0; } COMMTIMEOUTS cto; // タイムアウトの設定 //GetCommTimeouts( h, &cto ); // 現在の設定を流用する場合 cto.ReadIntervalTimeout = 10; // タイムアウト0.01秒に設定   cto.ReadTotalTimeoutMultiplier = 0; cto.ReadTotalTimeoutConstant = 10; cto.WriteTotalTimeoutMultiplier = 0; cto.WriteTotalTimeoutConstant = 0; SetCommTimeouts( h, &cto ); // タイムアウトの設定 DialogBox( hi, "DLG_DATA", // ダイアログ・ボックスを開く HWND_DESKTOP, (DLGPROC)dlgproc ); CloseHandle( h ); // デバイスのクローズ return TRUE; } BOOL CALLBACK dlgproc( HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) { static int sw[8] = { 0, 0, 0, 0, 0, 0, 0, 0 }; int i,n,n2; BYTE x; // 送信データ BYTE xm[10]; // 受信データ DWORD nn; switch(msg){ case WM_INITDIALOG: SetTimer( hwnd, 999, 100, NULL); // タイマの起動 // 0.1秒ごとにタイマ・メッセージをhWndへ送る return TRUE; // 処理を行った場合はTRUEを返す case WM_COMMAND: n = LOWORD( wp ); if( ID_o0 <= n && n <= ID_o3 ){ // あるチェックボックスが操作された n2 = ( n - ID_o0 ) / 10; // ID値は連続して10ずつ増加であること sw[ n2 ] = ! sw[ n2 ]; // 値を反転 SendMessage( GetDlgItem( hwnd, n ), BM_SETCHECK, sw[n2], 0); // 表示に反映 x = 0; // 出力データを組み立てる for( i = 0; i < 4; i++){ x = x + ( sw[ i ] << ( 3-i ) ) ; } WriteFile( h, &x, 1, &nn, 0 ); // 1文字送信 } return TRUE; case WM_TIMER: // このウィンドウに対してタイマは // 1つしかないのでタイマIDのチェックは省略 ReadFile( h, xm, 1, &nn, 0 ); // 1文字受信 if( nn == 1 ){ // 入力があった場合 if( xm[0] & 0x1 ) SetDlgItemText(hwnd,ID_i3,"1"); else SetDlgItemText(hwnd,ID_i3,"0"); if( xm[0] & 0x2 ) SetDlgItemText(hwnd,ID_i2,"1"); else SetDlgItemText(hwnd,ID_i2,"0"); if( xm[0] & 0x4 ) SetDlgItemText(hwnd,ID_i1,"1"); else SetDlgItemText(hwnd,ID_i1,"0"); if( xm[0] & 0x8 ) SetDlgItemText(hwnd,ID_i0,"1"); else SetDlgItemText(hwnd,ID_i0,"0"); } return TRUE; case WM_CLOSE: KillTimer( hwnd, 999); EndDialog( hwnd, 0 ); return TRUE; } return FALSE; }