// Copyright 2005 Doi Shigeki // list0804.cpp COMポート経由の制御の速度チェック // com1版 #include #include #include main() { HANDLE h; // ファイルハンドル h = CreateFile( "COM1", GENERIC_READ | GENERIC_WRITE, 0, // 非共有 0, // セキュリティ属性,使用しない OPEN_EXISTING, // 既存ファイルのオープン 0, 0 ); // 属性,テンプレート if( h == INVALID_HANDLE_VALUE ){ printf("オープン・エラー\n"); return; } DCB dcb; GetCommState( h , &dcb ); // 現在の設定をベースにして設定 dcb.ByteSize = 8; // 8ビット dcb.BaudRate = 57600; // 57600ボー dcb.fOutxCtsFlow = 0; // CTSを送信可に使わない(0)/使う(1) if( ! SetCommState( h , &dcb )){ printf("DCBのエラー\n"); return; } printf( "BaudRate=%d, ByteSize=%d, CTSflow=%d \n", dcb.BaudRate, dcb.ByteSize, dcb.fOutxCtsFlow ); 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 ); // タイムアウトの設定 DWORD nn; char c; // 送信用 char cbuf[10]; // 受信用 c = 0; while(1){ //printf("*"); // ループの様子をモニタするときには活かす WriteFile( h, &c, 1, &nn, 0 ); // 1文字送信 while( ReadFile( h, cbuf, 1, &nn, 0 )){ // 入力が無くとも10ミリ秒でタイムアウト if( nn == 1 ) // 入力が有った場合 break; } if( cbuf[0] != c ){ printf("エラー\n"); break; } c++; } CloseHandle( h ); }