シリアルポート(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()関数の最後に非同期用の
構造体を指定しないと、動作が保証できないといった警告がマニュアルには記述されて
います。