// RS232Cコントロールクラス // (C)2005 Yutaka Wada, AirparkLab /* 使い方 // プロジェクト内のstdafx.hで定義されている #define VC_EXTRALEAN が // もしあればコメントアウトしてください。 // 確保 #include "RS232CCtrl.h" CRS232CCtrl m_RSCtrl; // オープン(初期化) m_RSCtrl.Open( "COM1", "baud=9600 parity=N data=8 stop=1" ); // データ送信 BYTE SendBuff[] = "SEND DATA\r\n"; m_RSCtrl.Send( SendBuff, sizeof(SendBuff) ); // データ受信 BYTE ReceiveBuff[256]; DWORD n; n = m_RSCtrl.Recv( ReceiveBuff, 256 ); などとしてRS232C通信を行うことができます。終了処理はデストラクタで行って いますので特に必要ありません。 データ受信の際は,未読データ数のうち受信バッファサイズを超えない分だけ 取得して,取得したデータ数を戻します。 【注意点】 ・フロー制御は行いません。 ・受信イベントなどは発生しないので,通信速度と受信バッファサイズに見合った 間隔でReceive()関数を実行してデータを取得してください。 パブリックメンバ関数は以下の通り。 CRS232CCtrl() コンストラクタ HANDLE Open( LPCSTR pCom, LPCSTR pSetup ) オープン(初期化) DWORD Send( BYTE *pBuffer, DWORD nLength ) データ送信 DWORD Recv( BYTE *pBuffer, DWORD nBufferSize ) データ受信 ~CRS232CCtrl() デストラクタ(終了処理) */ #ifndef __RS232CCTRL_H__ #define __RS232CCTRL_H__ class CRS232CCtrl { HANDLE mHdl; DCB mDCB; COMMTIMEOUTS mTimeout; COMSTAT mStat; DWORD mErrors; public: // コンストラクタ CRS232CCtrl() { mHdl = INVALID_HANDLE_VALUE; } // デストラクタ(終了処理) ~CRS232CCtrl() { if( mHdl != INVALID_HANDLE_VALUE ){ CloseHandle( mHdl ); } } // オープン(初期化) HANDLE Open( LPCSTR pCom, LPCSTR pSetup ) { mHdl = CreateFile( pCom, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL ); if( mHdl != INVALID_HANDLE_VALUE ){ GetCommState( mHdl, &mDCB ); BuildCommDCB( pSetup, &mDCB ); mDCB.fRtsControl = RTS_CONTROL_DISABLE; mDCB.fOutxDsrFlow = FALSE; mDCB.fDsrSensitivity = FALSE; mDCB.fAbortOnError = FALSE; SetCommState( mHdl, &mDCB ); GetCommTimeouts( mHdl, &mTimeout ); mTimeout.ReadIntervalTimeout = MAXDWORD; mTimeout.ReadTotalTimeoutMultiplier = 1; mTimeout.ReadTotalTimeoutConstant = 500; mTimeout.WriteTotalTimeoutMultiplier = 1; mTimeout.WriteTotalTimeoutConstant = 500; SetCommTimeouts( mHdl, &mTimeout ); } return mHdl; } // データ送信 DWORD Send( BYTE *pBuffer, DWORD nLength ) { if( mHdl == INVALID_HANDLE_VALUE ){ return 0; } DWORD n; WriteFile( mHdl, pBuffer, nLength, &n, NULL ); return n; // 送信したバイト数 } // データ受信 DWORD Recv( BYTE *pBuffer, DWORD nBufferSize ) { if( mHdl == INVALID_HANDLE_VALUE ){ return 0; } ClearCommError( mHdl, &mErrors, &mStat ); DWORD n; n = mStat.cbInQue; if( n > 0 ){ if( nBufferSize < n ){ n = nBufferSize; } ReadFile( mHdl, pBuffer, n, &n, NULL ); } return n; // 受信したバイト数 } }; #endif