シリアルポート(COMポート)の操作方法
その4 タイムアウトの巻
//----------------------------------------------------------------------------- /// READ・WRITE復帰タイムアウト設定処理 //-----------------------------------------------------------------------------
COMMTIMEOUTS TimeOuts; // 通信タイムアウト構造体
// OSがWin9x系の時だけ設定します if( E_OSVersion == D_OS_WIN9X ) {
// TimeOuts.ReadIntervalTimeout = MAXWORD; // ReadTotalTimeoutMultiplierとReadTotalTimeoutConstantが0でMAXWARDならreadfileが即時リターンする TimeOuts.ReadTotalTimeoutMultiplier = 10000; // 1Byte毎のタイマ TimeOuts.ReadTotalTimeoutConstant = 1000; // 1関数コール毎のタイマ TimeOuts.WriteTotalTimeoutMultiplier = 1; // 1Byte毎のタイマ TimeOuts.WriteTotalTimeoutConstant = 1; // 1関数コール毎のタイマ // タイムアウト設定 SetCommTimeouts( E_ComPort, &TimeOuts );
}ポートのオープン処理は「その5」で紹介した通りなので、そちらを参考にして下さい。
UINT SimReadThread_9x( LPVOID pParam // [IN] 未使用 ) { BOOL Bool_Ret; // 関数戻り値 static char ReadBuff[10]; // 読み込みバッファ unsigned long ReadSize; // 読み込み完了サイズ BOOL Loop_End = FALSE; // 処理終了状態 //----------------------------------------------------------------------------- /// 端末からの電文受信処理 //----------------------------------------------------------------------------- // 電文受信待ちループ while( !Loop_End ) { // 読み込みバッファ初期化 memset( ReadBuff,NULL,sizeof(ReadBuff) );
// 1バイトずつ読み込み Bool_Ret = ReadFile( E_ComPort, ReadBuff, 1, &ReadSize, NULL ); // 読み込み結果チェック if( Bool_Ret == FALSE || ReadSize == 0 ) {
// エラーメッセージ表示 SimErrMsg( "%s[%d] 受信失敗(%d)", 0, __file__, __line__, GetLastError() ); // ループ終了フラグON Loop_End = TRUE; break; } else { // 読み込みOK // バッファリング処理 Bool_Ret = SimReadSuccess( (char)ReadBuff[0] ); // バッファリング処理失敗 if( Bool_Ret != TRUE ) { // エラーメッセージ表示 SimErrMsg( "%s[%d] バッファリング処理失敗(%d)", 0, __file__, __line__, GetLastError() ); } } } // スレッド終了 return(0); }読み込み処理そのものは普通の処理です。ただし、オープンするときに非同期モードで オープンしており、非同期でオープンした場合はReadFile()関数の最後に非同期用の 構造体を指定しないと、動作が保証できないといった警告がマニュアルには記述されて います。